Keras神经网络基础
Time:2021-06-22
前言
在结束了对一些基础概念的理解,终于开始了真正学习使用API接口搭建模型进行神经网络训练了。
keras 官方文档:Keras: the Python deep learning API
Author:雾雨霜星
欢迎来我的个人网站进行学习:
https://www.shuangxing.top/#/passage?id=26
Keras 基本概念
Keras:是一个Python深度学习框架,用于为深度学习搭建具体的模型。不直接处理或进行张量操作、数学计算等内容,这部分内容由张量库来完成,比如Tensorflow等。
官方定义:
Keras is a deep learning API written in Python, running on top of the machine learning platform TensorFlow. It was developed with a focus on enabling fast experimentation. Being able to go from idea to result as fast as possible is key to doing good research.
Tensorflow是一个谷歌开发的张量运算库。
Tensorflow的高度优化深度学习运算库:cuDNN。
Keras 神经网络训练过程
整个流程大概如下:
-
引入数据集,对数据集进行处理,留出验证集。
-
搭建神经网络结构(模型)
-
配置神经网络学习过程
-
开启训练
-
获取训练所得损失和精度数据,绘制图表确定训练状况
-
测试与评估
Keras定义学习模型的方法:
-
使用Sequential类:用于层的线性堆叠
使用leras.models.Sequential()创建一个模型容器,然后对模型容器model使用add方法添加模型的层keras.layers。
例如代码如下:
import tensorflow as tf import tensorflow.keras as keras model = keras.models.Sequential() model.add(keras.Input(shape=(10000,))) model.add(keras.layers.Dense(16)) model.add(keras.layers.Activation(keras.activations.relu)) model.add(keras.layers.Dense(16)) model.add(keras.layers.Activation(keras.activations.relu)) model.add(keras.layers.Dense(1)) model.add(keras.layers.Activation(keras.activations.sigmoid))
其中keras.Input(shape=(10000,))是输入层,其中参数需要确定每个样本的维度,shape按照样本维度从内到外来输入确定。
其中keras.layers.Dense(16)是全连接层,即一层神经元,需要确定该层神经元的个数。
其中keras.layers.Activation(keras.activations.relu)是激活函数层,正常来说每一层神经元(全连接层)后都会接一个激活函数。
-
使用函数式API:用于层组成的有向无环图
例如官方文档的参考代码:
import tensorflow as tf inputs = tf.keras.Input(shape=(3,)) x = tf.keras.layers.Dense(4, activation=tf.nn.relu)(inputs) outputs = tf.keras.layers.Dense(5, activation=tf.nn.softmax)(x) model = tf.keras.Model(inputs=inputs, outputs=outputs)
Keras配置学习过程:包括指定优化器(optimizer)、损失函数(loss)、评估标准函数(metrics)
使用keras.models.compile的方法
参考如下代码:
from keras import optimizer
# model是上述使用keras.models.Sequential()创建的
model.complie(optimizer=optimizer.RMSprop(lr=0.001),
loss='mse',
metrics=['accuracy'])
其中评估函数用于评估当前训练模型的性能,可以提供自定义的评价函数。
Keras开启学习过程:使用fit()方法输入数据的numpy格式数组到模型中。包括输入数据、批量大小、训练迭代轮次。
返回值是包含 每轮训练的训练集损失、验证集损失、训练集精度、验证集精度等参考数据的字典。
记得设置history接收model.fit的返回值。
参考代码如下:
history = model.fit(input_tensor,target_tensor,batch_size=128,epoch=10,validation_data_label)
input_tensor、target_tensor是实际训练集合实际训练集对应的标签,batch_size是每轮训练的批量,epoch是训练轮数,validation_data_label是每轮训练后用于进行验证的验证集数据和标签。
对于验证集的使用,官方文档解释:
validation_data: Data on which to evaluate the loss and any model metrics at the end of each epoch. The model will not be trained on this data. Thus, note the fact that the validation loss of data provided using validation_split or validation_data is not affected by regularization layers like noise and dropout.
# 百度翻译为:
验证数据:在每轮结束时用于评估损失和任何模型度量的数据。模型将不在此数据上进行训练。因此,请注意,使用validation\u split或validation\u数据提供的数据的验证丢失不受噪声和丢失等正则化层的影响。
Keras进行模型最终测试评估:
使用keras.models的evaluate API,对一开始设置出来的测试集进行测试评估,参考代码如下:
result = model.evaluate(test_data_f,test_label_f)
print(result)
所得result是一个列表,第一项是测试集的损失(loss),第二项以及后面的项,按照顺序,都是我们在model.complie中设置的metrics指标。
Keras提供的数据集:
-
IMDB数据集:包含来自互联网电影数据库的数万条严重两极分化的评论。
-
CIFAR数据集:图像分类数据集
-
Reuters数据集:新闻文本数据集
等
引入keras提供的数据集:
使用import引入keras.datasets具体数据集,然后对数据集使用load_data获取训练集和测试集,例如:
from tensorflow.keras.datasets import imdb
(train_data,train_label),(test_data,test_label) = imdb.load_data(num_words=10000)
Keras 神经网络模型常见的层(Layer)
-
输入层:
输入层并不在keras.layers中,而是直接使用keras调用,例如:
keras.Input(shape=(dim,))
其中shape是对输入训练集的每个样本的维度的确定,一般只需要确定一个维度。
比如对于电影评论数据集,通过one_hot编码转换后,整个数据集是一个矩阵,每个样本是一个行向量,这个行向量的长度就是需要我们在输入层确定的输入维度shape。
-
全连接层:
即keras.layers.Dense(units),就是一层神经元,该层神经元个数即由参数units决定。
注意的是,全连接层只能计算处理矩阵形式数据,即二维numpy的array的数据集。这完全就是因为这是一层神经元组成的结构,每个神经元执行的运算是线性运算,因此整个神经元层做的运算就是矩阵乘法。
例如:
model.add(keras.layers.Dense(16)) # 相当于执行:output = dot(input, kernel) + bias 其中kernel和bias即该层神经网络的参数矩阵和偏置参数矩阵。 model.add(keras.layers.Dense(16, activation=relu)) # 相当于执行:output = relu(dot(input, kernel) + bias)
官方文档有说:
Note: If the input to the layer has a rank greater than 2, then Dense computes the dot product between the inputs and the kernel along the last axis of the inputs and axis 0 of the kernel (using tf.tensordot). # 翻译如下: 注意:输入和内核之间的点积,沿着输入的最后一个轴和内核的0轴(使用tf.tensordot)。 For example, if input has dimensions (batch_size, d0, d1), then we create a kernel with shape (d1, units), and the kernel operates along axis 2 of the input, on every sub-tensor of shape (1, 1, d1) (there are batch_size * d0 such sub-tensors). The output in this case will have shape (batch_size, d0, units). # 翻译如下: 例如,如果输入有维度(batch_size,d0,d1),那么我们创建一个具有shape(d1,units)的核,核沿着输入的轴2,在shape(1,1,d1)的每个子张量上运行(有batch_size*d0这样的子张量)。这种情况下的输出将具有形状(批量大小,d0,单位)。
-
激活函数层:
虽然可以把激活函数放在全连接层的activation参数中设置,但是如果独立出一层,那么结构更加清晰明了。
使用keras.layers.Activation(activation)设置激活函数层,activation可以使用keras.activations中的激活函数确定。
参考代码如下:
model.add(keras.Input(shape=(10000,))) model.add(layers.Dense(128)) model.add(layers.Activation(keras.activations.relu))
一般每个全连接层后面都有一个激活函数。
-
嵌合层:
即 keras.layers.Embedding(input_dim,output_dim,input_length=),
其中参数input_dim是"输入的维度",特指最大检索数+1,即对于句子样本表示词汇量的大小;
其中参数output_dim是"输出的维度",特指每个样本在嵌合层处理后将每个样本的一个元素替代为多少长度的行向量;
其中参数input_length是输入每个样本序列的长度。
嵌合层只可以在模型的第一层使用,且输入的训练集是一个2D张量,格式为(batch_size,input_length)。
嵌合层的输出是3D张量,且输出处理后的训练集格式为(batch_size, input_length, output_dim)。
官方对Embedding层的定义是:
tf.keras.layers.Embedding( input_dim, output_dim, embeddings_initializer="uniform", embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None, **kwargs )
用途:1.数据降维(常用在对语言文本类数据的处理,代替one-hot编码实现数据量减少) 2.数据升维(常用于图片类数据处理,相当于放大细节)
详细可以看:https://blog.csdn.net/sinat_22510827/article/details/90727435
-
遮罩层:
即 keras.layers.Masking(mask_value) 其中参数mask_value是确定需要进行遮罩处理的值。
官方解释:
For each timestep in the input tensor (dimension #1 in the tensor), if all values in the input tensor at that timestep are equal to , then the timestep will be masked (skipped) in all downstream layers (as long as they support masking). #翻译为: 对于输入张量中的每个时间步(张量中的维数#1),如果该时间步的输入张量中的所有值都等于,则所有下游层中的时间步都将被屏蔽(跳过)(只要它们支持屏蔽)。
理解为,如果有一个训练集,特别是那种三维的(即含有时间维度)训练集,例如(samples, timesteps, features),对于其中的时间维度,可以使用Masking层来掩盖所有在一个时间维度值全为mask_value的那一序列,使得该别掩盖的序列在后面所有训练层中都不会参与。
一般用在训练集进入RNN或者LSTM之前。
-
匿名函数层:
即 keras.layers.Lambda(function),其中function是需要执行的简单数学变换计算。
官方定义:
tf.keras.layers.Lambda( function, output_shape=None, mask=None, arguments=None, **kwargs )
对通过该层的数据,确定要执行的数学变化,由于其中没有需要学习的参数,因此可以把那些数学变化包装为一个层来进行。
也可以认为是网络添加的自定义层。
-
其他层:
-
展平层(Flatten layers):常用于卷积层与全连接层之间,用于把多维数据展开为行向量数据。
卷积层(Convolution layers):与执行线性运算不同,卷积层用于执行卷积运算。
池化层(Pooling layers):在连续的卷积层中间,一般用于压缩数据与参数,减少过拟合。常见方法有Max pooling 和 average pooling。
Author:雾雨霜星
欢迎来我的个人网站进行学习:
https://www.shuangxing.top/#/passage?id=26
转载请注明出处!
Thanks!
PS: 毕竟,霜星酱水平有限,如果发现任何错误还请及时邮箱告知我,我会去改哦!