null Keras 文档阅读笔记(不定期更新) - K码农

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_biasTrue 时才有用)。注意:如果该层的输入的秩大于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) 的两个张量 ab,那么输出结果就会是尺寸为 (batch_size, 1) 的一个张量。在这个张量中,每一个条目 ia[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

对于小的 xlog(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

结构图

优化器

参数 clipnormclipvalue 能在所有的优化器中使用,用于控制梯度裁剪(Gradient Clipping)。

  • SGD

随机梯度下降优化器,包含扩展功能的支持:

  1. 动量(momentum)优化;
  2. 学习率衰减(每次参数更新后);
  3. 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_valuef(x) = max_value;如果 threshold <= x < max_valuef(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 因层而异,但 DenseConv1DConv2DConv3D 这些层具有统一的 API。

正则化器开放 3 个关键字参数:

  • kernel_regularizerkeras.regularizers.Regularizer 的实例
  • bias_regularizerkeras.regularizers.Regularizer 的实例
  • activity_regularizerkeras.regularizers.Regularizer 的实例

任何输入一个权重矩阵、返回一个损失贡献张量的函数,都可以用作正则化器。

结构图

约束

constraints 模块的函数允许在优化期间对网络参数设置约束(例如非负性)。

约束是以层为对象进行的。具体的 API 因层而异,但 DenseConv1DConv2DConv3D 这些层具有统一的 API。

约束层开放 2 个关键字参数:kernel_constraint 用于主权重矩阵;bias_constraint 用于偏置。

  • MaxNorm

MaxNorm 最大范数权值约束。映射到每个隐藏单元的权值的约束,使其具有小于或等于期望值的范数。

  • NonNeg

权重非负的约束。

  • UnitNorm

映射到每个隐藏单元的权值的约束,使其具有单位范数。

  • MinMaxNorm

MinMaxNorm 最小/最大范数权值约束。映射到每个隐藏单元的权值的约束,使其范数在上下界之间。

结构图