Keras主要模块简介
tf.keras的使用说明了高层API已经被tensorflow使用。tf.keras下提供了许多模块,如:
1)activations激励函数,如relu、softmax、sigmoid等
2)applications应用模型,如densenet、mobilenet、vgg16等
3)dataset数据,如mnist、fashion_mnist等
4)layers神经网络层,如dense、conv2d等
5)model模型,如save、load等
6)utils工具,如to_categorical将类向量转化为二进制类矩阵等
一、keras.layers神经网络层
1、常见layer神经网络层
Input(…): 用于实例化一个输入 Tensor,作为神经网络的输入。
average_pooling1d(…): 一维平均池化层
average_pooling2d(…): 二维平均池化层
average_pooling3d(…):三维平均池化层
batch_normalization(…): 批量标准化层
conv1d(…): 一维卷积层
conv2d(…): 二维卷积层
conv2d_transpose(…): 二维反卷积层
conv3d(…): 三维卷积层
conv3d_transpose(…): 三维反卷积层
dense(…): 全连接层
dropout(…): Dropout层
flatten(…): Flatten层,即把一个 Tensor 展平,变为1维Tensor
max_pooling1d(…): 一维最大池化层
max_pooling2d(…): 二维最大池化层
max_pooling3d(…): 三维最大池化层
separable_conv2d(…): 二维深度可分离卷积层
2、查看Model中某一层的权重和偏置
神经网络中可分为卷积层、池化层、全连接层等,并不是Model中的每一层都是可以查看的,如卷积层可以查看权重和偏置,但池化层就不能查看,因为池化层本身没有权重和偏置,这就首先需要理解神经网络各个层次背后的数学推导。Keras中查看某一层的权重和偏置使用model.get_layer('conv2d_1').get_weights(),其中conv2d_1为卷积层的名称。
weight_bc1, bias_bc1 = east_detect.get_layer('block1_conv1').get_weights()
二、keras.Model模型训练、评估、预测
1、model.compile 配置模型的训练参数,主要是优化器与损失函数
在训练模型之前,我们需要通过compile来对学习过程进行配置,compile接收三个参数:优化器optimizer,损失函数loss,指标列表metrics。
compile(self, optimizer, loss, metrics=None, sample_weight_mode=None)
optimizer:字符串(预定义优化器名)或者优化器对象,,如 rmsprop
或 adagrad
,也可以是 Optimizer 类的实例。详见:optimizers。
loss:字符串(预定义损失函数名)或目标函数,模型试图最小化的目标函数,它可以是现有损失函数的字符串标识符,如categorical_crossentropy
或 mse
,也可以是一个目标函数。详见:losses。
metrics:列表,包含评估模型在训练和测试时的网络性能的指标,典型用法是metrics=[‘accuracy’]。评估标准可以是现有的标准的字符串标识符,也可以是自定义的评估标准函数。
例子:
# 多分类问题
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 二分类问题
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 均方误差回归问题
model.compile(optimizer='rmsprop',
loss='mse')
# 自定义评估标准函数
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
2、训练模型的三个独立函数fit、fit_generator、train_on_batch
1)使用fit()函数
当使用.fit()函数时,意味着如下两个条件成立:1)训练数据可以 完整地 放入到内存(RAM)里;2)数据已经不需要再进行任何处理了。 (实际的数据集不会都像Tensorflow官方教程中经常使用的MNIST数据集那样小,一次性加载训练数据到fit是行不通的。)
fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)
- x: 训练数据的 Numpy 数组。 如果模型中的输入层被命名,你也可以传递一个字典,将输入层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,x 可以是
None
(默认)。 - y: 目标(标签)数据的 Numpy 数组。 如果模型中的输出层被命名,你也可以传递一个字典,将输出层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,y 可以是
None
(默认)。 - batch_size: 整数或
None
。每次提度更新的样本数。如果未指定,默认为 32. - epochs: 整数。训练模型迭代轮次。一个轮次是在整个
x
或y
上的一轮迭代。请注意,与initial_epoch
一起,epochs
被理解为 「最终轮次」。模型并不是训练了epochs
轮,而是到第epochs
轮停止训练。 - verbose: 0, 1 或 2。日志显示模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮一行。
- callbacks: 一系列的
keras.callbacks.Callback
实例。一系列可以在训练时使用的回调函数。callbacks可以做的事情有:1)将每一个训练batch的精度写入tensorBoard中的logs以便查阅;2)周期性地将你的模型保存至disk硬盘中;3)提前终止训练。详见 callbacks。 - validation_split: 在 0 和 1 之间浮动。用作验证集的训练数据的比例。模型将分出一部分不会被训练的验证数据,并将在每一轮结束时评估这些验证数据的误差和任何其他模型指标。验证数据是混洗之前
x
和y
数据的最后一部分样本中。
2)使用fit_generator()
在Keras中对于小样本数据而言可以使用fit()和predict(),因为它们可以被一次性放入到内存中。大多数的数据都是非常大的,并且不能一次性加载到内存中。解决办法就是使用fit_generator()和predict_generator(),这是在训练和预测过程中将图像加载到内存中的常用数据生成函数。
- .fit is used when the entire training dataset can fit into the memory and no data augmentation is applied.
- .fit_generator is used when either we have a huge dataset to fit into our memory or when data augmentation needs to be applied.
3)model.train_on_batch 运行一批样品的单次梯度更新
train_on_batch用于非固定batch_size的模型训练与模型的继续训练。train_on_batch
allows you to expressly update weights based on a collection of samples you provide, without regard to any fixed batch size. One case when it might be nice to use train_on_batch
is for updating a pre-trained model on a single new batch of samples. Suppose you've already trained and deployed a model, and sometime later you've received a new set of training samples previously never used. You could use train_on_batch
to directly update the existing model only on those samples. Other methods can do this too, but it is rather explicit to use train_on_batch
for this case.
3、model.evaluate 模型评估
model.evaluate是评估你训练的模型,它的输出结果是精度accuracy与损失,而不是预测你输入的数据。若需要对当前输入数据进行预测可使用model.predict。
4、model.predict 模型预测
model.predict除了对于输出层预测外,还能对于中间层进行预测,具体方法为重新搭建一个中间层为最终输出的模型,进行predict。
# 获取中间层输出
layer_name = 'dense_2'
intermediate_layer_model = Model(inputs=load_model.input, outputs=load_model.get_layer(layer_name).output)
intermediate_output = intermediate_layer_model.predict(x_test_forpredict)
三、keras.utils工具
1)to_categorical 将类向量(整数)转换为二进制类矩阵。
keras.utils.to_categorical(y, num_classes=None, dtype='float32')
例如,用于 categorical_crossentropy。
参数
- y: 需要转换成矩阵的类矢量 (从 0 到 num_classes 的整数)。
- num_classes: 总类别数。
- dtype: 字符串,输入所期望的数据类型 (
float32
,float64
,int32
...)
示例
# 考虑一组 3 个类 {0,1,2} 中的 5 个标签数组:
> labels
array([0, 2, 1, 2, 0])
# `to_categorical` 将其转换为具有尽可能多表示类别数的列的矩阵。
# 行数保持不变。
> to_categorical(labels)
array([[ 1., 0., 0.],
[ 0., 0., 1.],
[ 0., 1., 0.],
[ 0., 0., 1.],
[ 1., 0., 0.]], dtype=float32)
返回
输入的二进制矩阵表示。
2)绘制网络模型
from tensorflow.keras.utils import plot_model
# 用于 Keras绘制网络模型
draw_model = False
if draw_model == True:
plot_model(model, show_shapes=True,to_file='../model.png')
参考文章:
【1】https://www.tensorflow.org/api_docs/python/tf/keras/Model