目录
Keras 文档阅读笔记(不定期更新)
本文是 Keras 2.2.4 文档的阅读笔记,旨在以自顶向下的角度建立起对 Keras 主要模块的认识,同时方便记忆。
内容将不定期更新补充。
模型
Sequential 模型方法
-
compile
:用于配置模型的训练方法。 -
fit
:以固定数量的轮次(epoch)训练模型。 -
evaluate
:在测试模式,返回误差值和评估标准值,计算逐批次(batch)进行。 -
predict
:为输入样本生成输出预测,计算逐批次(batch)进行。 -
train_on_batch
:一批样品的单次梯度更新。 -
test_on_batch
:在一批样本上评估模型。 -
predict_on_batch
:返回一批样本的模型预测值。 -
fit_generator
:使用 Python 生成器或Sequence
实例逐批生成的数据,按批次训练模型。生成器与模型并行运行,以提高效率。 -
evaluate_generator
:在数据生成器上评估模型。 -
predict_generator
:为来自数据生成器的输入样本生成预测。 -
get_layer
:根据名称(唯一)或索引值查找网络层。
Model 类(函数式 API)
在函数式 API 中,给定一些输入张量(tensor)和输出张量,可以实例化一个 Model
。
方法
-
compile
:用于配置模型的训练方法。 -
fit
:以固定数量的轮次(epoch)训练模型。 -
evaluate
:在测试模式,返回误差值和评估标准值,计算逐批次(batch)进行。 -
predict
:为输入样本生成输出预测,计算逐批次(batch)进行。 -
train_on_batch
:一批样品的单次梯度更新。 -
test_on_batch
:在一批样本上评估模型。 -
predict_on_batch
:返回一批样本的模型预测值。 -
fit_generator
:使用 Python 生成器或Sequence
实例逐批生成的数据,按批次训练模型。生成器与模型并行运行,以提高效率。 -
evaluate_generator
:在数据生成器上评估模型。 -
predict_generator
:为来自数据生成器的输入样本生成预测。 -
get_layer
:根据名称(唯一)或索引值查找网络层。
层
关于 Keras 网络层
所有 Keras 网络层都有很多共同的函数:
-
layer.get_weights()
:以含有 Numpy 矩阵的列表形式返回层的权重。 -
layer.set_weights(weights)
:从含有 Numpy 矩阵的列表中设置层的权重(与get_weights
的输出形状相同)。 -
layer.get_config()
:返回包含层配置的字典。
如果一个层具有单个节点(i.e. 如果它不是共享层), 可以得到它的输入张量、输出张量、输入尺寸和输出尺寸:
layer.input
layer.output
layer.input_shape
layer.output_shape
如果层有多个节点, 可以使用以下函数:
layer.get_input_at(node_index)
layer.get_output_at(node_index)
layer.get_input_shape_at(node_index)
layer.get_output_shape_at(node_index)
核心层
Dense
常用的的全连接层。Dense
实现以下操作: output = activation(dot(input, kernel) + bias)
其中 activation
是按逐个元素计算的激活函数,kernel
是由网络层创建的权值矩阵,以及 bias
是其创建的偏置向量(只在 use_bias
为 True
时才有用)。注意:如果该层的输入的秩大于2,那么它首先被展平然后 再计算与 kernel
的点乘。
Activation
将激活函数应用于输出。
Dropout
将 Dropout 应用于输入。Dropout 包括在训练中每次更新时,将输入单元的按比率随机设置为 0,这有助于防止过拟合。
Flatten
将输入展平。
Input
Input()
用于实例化 Keras 张量。
Reshape
将输入重新调整为特定的尺寸。
- Permute
根据给定的模式置换输入的维度。在某些场景下很有用,例如将 RNN 和 CNN 连接在一起。
RepeatVector
将输入重复 n
次。
Lambda
将任意表达式封装为 Layer
对象。
ActivityRegularization
对基于代价函数的输入活动应用一个更新。
Masking
使用覆盖值覆盖序列,以跳过时间步。对于输入张量的每一个时间步(张量的第一个维度),如果所有时间步中输入张量的值与 mask_value
相等,那么这个时间步将在所有下游层被覆盖(跳过)。
SpatialDropout1D
Dropout 的 Spatial 1D 版本。此版本的功能与 Dropout 相同,但它会丢弃整个 1D 的特征图而不是丢弃单个元素。
SpatialDropout2D
Dropout 的 Spatial 2D 版本。此版本的功能与 Dropout 相同,但它会丢弃整个 2D 的特征图而不是丢弃单个元素。
SpatialDropout3D
Dropout 的 Spatial 3D 版本。此版本的功能与 Dropout 相同,但它会丢弃整个 3D 的特征图而不是丢弃单个元素。
结构图
卷积层
Conv1D
1D 卷积层(例如时序卷积)。该层创建了一个卷积核,该卷积核以单个空间(或时间)维上的层输入进行卷积,以生成输出张量。
Conv2D
2D 卷积层(例如对图像的空间卷积)。该层创建了一个卷积核,该卷积核对层输入进行卷积,以生成输出张量。
Conv3D
3D 卷积层(例如立体空间卷积)。该层创建了一个卷积核,该卷积核对层输入进行卷积,以生成输出张量。
SeparableConv1D
深度方向的可分离 1D 卷积。
可分离的卷积的操作包括,首先执行深度方向的空间卷积(分别作用于每个输入通道),紧接一个将所得输出通道 混合在一起的逐点卷积。
直观地说,可分离的卷积可以理解为一种将卷积核分解成 两个较小的卷积核的方法,或者作为 Inception 块的 一个极端版本。
SeparableConv2D
深度方向的可分离 2D 卷积。
可分离的卷积的操作包括,首先执行深度方向的空间卷积(分别作用于每个输入通道),紧接一个将所得输出通道 混合在一起的逐点卷积。
直观地说,可分离的卷积可以理解为一种将卷积核分解成 两个较小的卷积核的方法,或者作为 Inception 块的 一个极端版本。
DepthwiseConv2D
深度可分离 2D 卷积。深度可分离卷积包括仅执行深度空间卷积中的第一步(其分别作用于每个输入通道)。
Conv2DTranspose
转置卷积层(或被成为反卷积)。对转置卷积的需求一般来自希望使用与正常卷积相反方向的变换,即,将具有卷积输出尺寸的东西 转换为具有卷积输入尺寸的东西,同时保持与所述卷积相容的连通性模式。
Conv3DTranspose
转置卷积层(或被成为反卷积)。对转置卷积的需求一般来自希望使用与正常卷积相反方向的变换,即,将具有卷积输出尺寸的东西转换为具有卷积输入尺寸的东西,同时保持与所述卷积相容的连通性模式。
Cropping1D
1D 输入的裁剪层(例如时间序列),它沿着时间维度(第 1 个轴)裁剪。
Cropping2D
2D 输入的裁剪层(例如图像),它沿着空间维度裁剪,即宽度和高度。
Cropping3D
3D 数据的裁剪层(例如空间或时空)。
UpSampling1D
1D 输入的上采样层。
UpSampling2D
2D 输入的上采样层。
UpSampling3D
3D 输入的上采样层。
ZeroPadding1D
1D 输入的零填充层(例如,时间序列)。
ZeroPadding2D
2D 输入的零填充层(例如图像)。该图层可以在图像张量的顶部、底部、左侧和右侧添加零表示的行和列。
ZeroPadding3D
3D 数据的零填充层(空间或时空)。
结构图
池化层
MaxPooling1D
对于时序数据的最大池化。
MaxPooling2D
对于空间数据的最大池化。
MaxPooling3D
对于 3D(空间,或时空间)数据的最大池化。
AveragePooling1D
对于时序数据的平均池化。
AveragePooling2D
对于空间数据的平均池化。
AveragePooling3D
对于 3D (空间,或者时空间)数据的平均池化。
GlobalMaxPooling1D
对于时序数据的全局最大池化。
GlobalAveragePooling1D
对于时序数据的全局平均池化。
GlobalMaxPooling2D
对于空间数据的全局最大池化。
GlobalAveragePooling2D
对于空间数据的全局平均池化。
GlobalMaxPooling3D
对于 3D 数据的全局最大池化。
GlobalAveragePooling3D
对于 3D 数据的全局平均池化。
结构图
循环层
RNN
循环神经网络层基类。
该层支持以可变数量的时间步对输入数据进行 masking。
可以将 RNN 层设置为 stateful
(有状态的),这意味着针对一个批次的样本计算的状态将被重新用作下一批样本的初始状态。这假定在不同连续批次的样品之间有一对一的映射。要重置模型的状态,请在特定图层或整个模型上调用 .reset_states()
。
SimpleRNN
全连接的 RNN,其输出将被反馈到输入。
GRU
门限循环单元网络,有两种变体。
LSTM
长短期记忆网络层。
ConvLSTM2D
卷积 LSTM。它类似于 LSTM 层,但输入变换和循环变换都是卷积的。
ConvLSTM2DCell
ConvLSTM2D
的单元(Cell)类。
SimpleRNNCell
SimpleRNN
的单元(Cell)类。
GRUCell
GRU
层的单元(Cell)类。
- LSTMCell
LSTM
层的单元(Cell)类。
CuDNNGRU
由 CuDNN 支持的快速 GRU 实现。只能以 TensorFlow 后端运行在 GPU 上。
CuDNNLSTM
由 CuDNN 支持的快速 LSTM 实现。只能以 TensorFlow 后端运行在 GPU 上。
结构图
融合层
Add
计算输入张量列表的和。它接受一个张量的列表,所有的张量必须有相同的输入尺寸,然后返回一个张量(和输入张量尺寸相同)。
Subtract
计算两个输入张量的差。它接受一个长度为 2 的张量列表,两个张量必须有相同的尺寸,然后返回一个值为(inputs[0] - inputs[1]
)的张量,输出张量和输入张量尺寸相同。
Multiply
计算输入张量列表的(逐元素间的)乘积。它接受一个张量的列表,所有的张量必须有相同的输入尺寸,然后返回一个张量(和输入张量尺寸相同)。
Average
计算输入张量列表的平均值。它接受一个张量的列表,所有的张量必须有相同的输入尺寸,然后返回一个张量(和输入张量尺寸相同)。
Maximum
计算输入张量列表的(逐元素间的)最大值。它接受一个张量的列表,所有的张量必须有相同的输入尺寸,然后返回一个张量(和输入张量尺寸相同)。
Minimum
计算输入张量列表的(逐元素间的)最小值。它接受一个张量的列表,所有的张量必须有相同的输入尺寸,然后返回一个张量(和输入张量尺寸相同)。
Concatenate
连接一个输入张量的列表。它接受一个张量的列表,除了连接轴之外,其他的尺寸都必须相同,然后返回一个由所有输入张量连接起来的输出张量。
Dot
计算两个张量之间样本的点积。
例如,如果作用于输入尺寸为 (batch_size, n)
的两个张量 a
和 b
,那么输出结果就会是尺寸为 (batch_size, 1)
的一个张量。在这个张量中,每一个条目 i
是 a[i]
和 b[i]
之间的点积。
结构图
高级激活层
LeakyReLU
带泄漏的 ReLU。当神经元未激活时,它仍允许赋予一个很小的梯度: f(x) = alpha * x for x < 0
, f(x) = x for x >= 0
。
PReLU
参数化的 ReLU。形式: f(x) = alpha * x for x < 0
, f(x) = x for x >= 0
, 其中 alpha
是一个可学习的数组,尺寸与 x 相同。
ELU
指数线性单元。形式: f(x) = alpha * (exp(x) - 1.) for x < 0
, f(x) = x for x >= 0
。
ThresholdedReLU
带阈值的 ReLU。形式: f(x) = x for x > theta
, f(x) = 0 otherwise
。
Softmax
Softmax 激活函数。
ReLU
ReLU 激活函数。使用默认值时,它返回逐个元素的 max(x,0)
。否则:
- 如果
x >= max_value
,返回f(x) = max_value
, - 如果
threshold <= x < max_value
,返回f(x) = x
, - 否则,返回
f(x) = negative_slope * (x - threshold)
。
结构图
其他层
嵌入层
Embedding
将正整数(索引值)转换为固定尺寸的稠密向量。该层只能用作模型中的第一层。
标准化层
BatchNormalization
批量标准化层,在每一个批次的数据中标准化前一层的激活项,即,应用一个维持激活项平均值接近 0,标准差接近 1 的转换。
噪声层
GaussianNoise
应用以 0 为中心的加性(additive)高斯噪声。它是一个正则化层,只在训练时才被激活。
GaussianDropout
应用以 1 为中心的乘性(multiplicative)高斯噪声。它是一个正则化层,只在训练时才被激活。
AlphaDropout
将 Alpha Dropout 应用到输入。
Alpha Dropout 是一种 Dropout,它保持输入的平均值和方差与原来的值不变,以确保即使在 dropout 后也能实现自我归一化。通过随机将激活设置为负饱和值,Alpha Dropout 非常适合按比例缩放的指数线性单元(SELU)。
局部连接层
LocallyConnected1D
1D 输入的局部连接层。
LocallyConnected1D
层与 Conv1D
层的工作方式相同,除了权值不共享外,也就是说,在输入的每个不同部分应用不同的一组过滤器。
LocallyConnected2D
2D 输入的局部连接层。
LocallyConnected2D
层与 Conv2D
层的工作方式相同,除了权值不共享外,也就是说,在输入的每个不同部分应用不同的一组过滤器。
层封装器
TimeDistributed
这个封装器将一个层应用于输入的每个时间片。输入至少为 3D,且第一个维度应该是时间所表示的维度。
Bidirectional
RNN
的双向封装器,对序列进行前向和后向计算。
结构图
损失函数
第一个参数是真值,第二个参数是预测值。
mean_squared_error
mean_absolute_error
mean_absolute_percentage_error
mean_squared_logarithmic_error
squared_hinge
hinge
categorical_hinge
logcosh
对于小的 x
,log(cosh(x))
近似等于 (x ** 2) / 2
。对于大的 x
,近似于 abs(x) - log(2)
。这表示 logcosh
与均方误差大致相同,但是不会受到偶尔极端的错误预测的影响。
categorical_crossentropy
当使用 categorical_crossentropy
损失时,目标值应该是分类格式(即,如果有 10 个类,每个样本的目标值应该是一个 10 维的向量,这个向量除了表示类别的那个索引为 1,其他均为 0)。为了将整数目标值转换为分类目标值,你可以使用 Keras 实用函数 to_categorical
。
sparse_categorical_crossentropy
binary_crossentropy
kullback_leibler_divergence
poisson
cosine_proximity
结构图
评估标准
评价函数用于评估当前训练模型的性能。
自定义评价函数应该在编译的时候(compile)传递进去。该函数需要以 (y_true, y_pred)
作为输入参数,并返回一个张量作为输出结果。
binary_accuracy
categorical_accuracy
sparse_categorical_accuracy
top_k_categorical_accuracy
sparse_top_k_categorical_accuracy
结构图
优化器
参数 clipnorm
和 clipvalue
能在所有的优化器中使用,用于控制梯度裁剪(Gradient Clipping)。
SGD
随机梯度下降优化器,包含扩展功能的支持:
- 动量(momentum)优化;
- 学习率衰减(每次参数更新后);
- Nestrov 动量(NAG)优化。
RMSprop
RMSProp 优化器,常是训练循环神经网络 RNN 的不错选择。建议使用优化器的默认参数(除了学习率 lr
)。
Adagrad
Adagrad 优化器,Adagrad 是一种具有特定参数学习率的优化器,它根据参数在训练期间的更新频率进行自适应调整。参数接收的更新越多,更新越小。建议使用优化器的默认参数。
Adadelta
Adadelta 优化器,是 Adagrad 的一个具有更强鲁棒性的的扩展版本,可以设置初始学习速率和衰减因子。建议使用优化器的默认参数。
Adam
Adam 本质上是 RMSProp
与动量 momentum 的结合
Adamax
Adamax 优化器,是 Adam 算法基于无穷范数(infinity norm)的变种。
Nadam
Nesterov 版本 Adam
优化器,Nadam 是采用 Nesterov momentum 版本的 Adam
优化器。建议使用优化器的默认参数。
结构图
激活函数
激活函数可以通过设置单独的激活层实现,也可以在构造层对象时通过传递 activation
参数实现。
softmax
Softmax 激活函数。
elu
指数线性单元,如果 x > 0
,返回值为 x
;如果 x < 0
返回值为 alpha * (exp(x)-1)
。
selu
可伸缩的指数线性单元(SELU),等同于:scale * elu(x, alpha)
,其中 alpha 和 scale 是预定义的常量。
softplus
Softplus 激活函数,返回 log(exp(x) + 1)
.
softsign
Softsign 激活函数,返回 x / (abs(x) + 1)
.
relu
整流线性单元。使用默认值时,它返回逐元素的 max(x, 0)
;否则,它遵循:如果 x >= max_value
:f(x) = max_value
;如果 threshold <= x < max_value
:f(x) = x
;否则:f(x) = alpha * (x - threshold)
。
tanh
双曲正切激活函数。
sigmoid
Sigmoid 激活函数。
hard_sigmoid
Hard sigmoid 激活函数,如果 x < -2.5
,返回 0
;如果 x > 2.5
,返回 1
;如果 -2.5 <= x <= 2.5
,返回 0.2 * x + 0.5
。
exponential
自然数指数激活函数。
linear
线性激活函数(即不做任何改变)。
结构图
正则化
正则化器允许在优化过程中对层的参数或层的激活情况进行惩罚。网络优化的损失函数也包括这些惩罚项。
惩罚是以层为对象进行的。具体的 API 因层而异,但 Dense
、Conv1D
、Conv2D
和 Conv3D
这些层具有统一的 API。
正则化器开放 3 个关键字参数:
-
kernel_regularizer
:keras.regularizers.Regularizer
的实例 -
bias_regularizer
:keras.regularizers.Regularizer
的实例 -
activity_regularizer
:keras.regularizers.Regularizer
的实例
任何输入一个权重矩阵、返回一个损失贡献张量的函数,都可以用作正则化器。
结构图
约束
constraints
模块的函数允许在优化期间对网络参数设置约束(例如非负性)。
约束是以层为对象进行的。具体的 API 因层而异,但 Dense
,Conv1D
,Conv2D
和 Conv3D
这些层具有统一的 API。
约束层开放 2 个关键字参数:kernel_constraint
用于主权重矩阵;bias_constraint
用于偏置。
MaxNorm
MaxNorm 最大范数权值约束。映射到每个隐藏单元的权值的约束,使其具有小于或等于期望值的范数。
NonNeg
权重非负的约束。
UnitNorm
映射到每个隐藏单元的权值的约束,使其具有单位范数。
MinMaxNorm
MinMaxNorm 最小/最大范数权值约束。映射到每个隐藏单元的权值的约束,使其范数在上下界之间。
结构图