Keras 模型
Keras有两种类型的模型,序贯模型(Sequential)和函数式模型(Model),函数式模型应用更为广泛,序贯模型是函数式模型的一种特殊情况。
两类模型有一些方法是相同的:
model.summary()
:打印出模型概况model.get_config()
:返回包含模型配置信息的 Python 字典。模型也可以从它的 config 信息中重构回去
config = model.get_config()
model = Model.from_config(config)
model = Sequential.from_config(config)
model.get_layer()
:依据层名或下标获得层对象model.get_weights()
:返回模型权重张量的列表,类型为 numpy arraymodel.set_weights()
:从 numpy array 里将权重载入给模型,要求数组具有与model.get_weights()
相同的形状。model.save_weights(filepath)
:将模型权重保存到指定路径,文件类型是 HDF5(后缀是 .h5)model.load_weights(filepath, by_name=False)
:从 HDF5 文件中加载权重到当前模型中, 默认情况下模型的结构将保持不变。如果想将权重载入不同的模型(有些层相同)中,则设置by_name=True
,只有名字匹配的层才会载入权重
Sequential 模型接口
在Sequntial 模型中,我们已经介绍了模型的基本使用方法和实例,下面我们进一步对 Sequential 的 API 和参数做详细的介绍。
首先我们了解一下常用的 Sequential 属性:
model.layers
是添加到模型上的层的 list
注:考虑到本文只是快速指南,因而省略了部分高级的属性和方法。
add 添加层
向模型中添加一个层。
add(self, layer)
- layer: Layer 对象
pop 删除层
弹出模型最后的一层,无返回值
pop(self)
compile 编译模型
compile(self, optimizer, loss, metrics=None)
- optimizer:字符串(预定义优化器名)或优化器对象
- loss:字符串(预定义损失函数名)或目标函数
- metrics:列表,包含评估模型在训练和测试时的网络性能的指标,典型用法是
metrics=['accuracy']
model = Sequential()
model.add(Dense(32, input_shape=(500,)))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
模型在使用前必须编译,否则在调用 fit
或 evaluate
时会抛出异常。
如果你只是载入模型并利用其 predict,可以不用进行 compile。在 Keras 中,compile 主要完成损失函数和优化器的一些配置,是为训练服务的。predict 会在内部进行符号函数的编译工作。
fit 训练模型
将模型训练 nb_epoch
轮。
fit(self, x, y, batch_size=32, epochs=10, verbose=1, validation_split=0.0, validation_data=None, shuffle=True)
- x:输入数据。如果模型只有一个输入,那么 x 的类型是 numpy array,如果模型有多个输入,那么 x 的类型应当为 list,list 的元素是对应于各个输入的 numpy array
- y:标签,numpy array
- batch_size:整数,指定进行梯度下降时每个 batch 包含的样本数。训练时一个 batch 的样本会被计算一次梯度下降,使目标函数优化一步。
- epochs:整数,训练的轮数,每个 epoch 会把训练集轮一遍。
- verbose:日志显示,0 为不在标准输出流输出日志信息,1 为输出进度条记录,2 为每个epoch输出一行记录
- validation_split:0~1 之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个 epoch 结束后测试的模型的指标,如损失函数、精确度等。注意,validation_split 的划分在 shuffle 之前,因此如果你的数据本身是有序的,需要先手工打乱再指定 validation_split,否则可能会出现验证集样本不均匀。
- validation_data:形式为 (X,y) 的 tuple,是指定的验证集。此参数将覆盖 validation_spilt。
- shuffle:布尔值或字符串,一般为布尔值,表示是否在训练过程中随机打乱输入样本的顺序。若为字符串“batch”,则是用来处理HDF5数据的特殊情况,它将在batch内部将数据打乱。
fit
函数返回一个 History
的对象,其 History.history
属性记录了损失函数和其他指标的数值随 epoch 变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况。
evaluate 测试模型
按 batch 计算在某些输入数据上模型的误差
evaluate(self, x, y, batch_size=32, verbose=1)
- x:输入数据,与
fit
一样,是 numpy array 或 numpy array 的 list - y:标签,numpy array
- batch_size:整数,指定进行测试时每个 batch 包含的样本数。
- verbose:日志显示,0 为不在标准输出流输出日志信息,1 为输出进度条记录
本函数返回一个测试误差的标量值(如果模型没有其他评价指标),或一个标量的 list(如果模型还有其他的评价指标)。model.metrics_names
将给出 list 中各个值的含义。
predict 预测
按 batch 获得输入数据对应的预测结果,返回各个类别的可能性结果,是一个 n 维向量,n 等于类别的数量。
predict(self, x, batch_size=32, verbose=0)
- x:输入数据,与
fit
一样,是 numpy array 或 numpy array 的 list - batch_size:整数,每批次选取的数据集数量
- verbose:日志显示,0 为不在标准输出流输出日志信息,1 为输出进度条记录
predict_classes 预测类别
按 batch 产生输入数据的类别预测结果,返回的是最可能的类别名称。
predict_classes(self, x, batch_size=32, verbose=1)
函数式模型接口
Keras 的函数式模型为 Model
,即广义的拥有输入和输出的模型,我们使用 Model
来初始化一个函数式模型:
from keras.models import Model
from keras.layers import Input, Dense
a = Input(shape=(32,))
b = Dense(32)(a)
model = Model(inputs=a, outputs=b)
在这里,我们的模型以 a
为输入,以 b
为输出,同样我们可以构造拥有多输入和多输出的模型:
model = Model(inputs=[a1, a2], outputs=[b1, b3, b3])
在Functional 模型中,我们已经介绍了模型的基本使用方法和实例,下面我们进一步对函数式模型的 API 和参数做详细的介绍。
首先我们了解一下常用的 Modell 属性:
model.layers
:组成模型图的各个层model.inputs
:模型的输入张量列表model.outputs
:模型的输出张量列表
Model 模型的方法除了没有 add、pop 方法外与 Sequential 模型几乎是相同的,这里就不做赘述了。
Keras 层
所有的 Keras 层对象都有如下方法:
layer.get_weights()
:返回层的权重(numpy array)layer.set_weights(weights)
:从 numpy array 中将权重加载到该层中,要求 numpy array 的形状与layer.get_weights()
的形状相同layer.get_config()
:返回当前层配置信息的字典,层也可以借由配置信息重构:
layer = Dense(32)
config = layer.get_config()
reconstructed_layer = Dense.from_config(config)
或者:
from keras import layers
config = layer.get_config()
layer = layers.deserialize({'class_name': layer.__class__.__name__,
'config': config})
如果层仅有一个计算节点(即该层不是共享层),则可以通过下列方法获得输入张量、输出张量、输入数据的形状和输出数据的形状:
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)
常用层
常用层对应于 core 模块,core 内部定义了一系列常用的网络层,包括全连接、激活层等。
Dense 层
Dense 就是全连接层。
keras.layers.core.Dense(units, activation=None)
- units:大于 0 的整数,代表该层的输出维度。
- activation:激活函数,为预定义的激活函数名。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:$a(x)=x$)
该层的输入为形如 (nb_samples, …, input_shape[1]) 的 nD 张量,最常见的情况为 (nb_samples, input_dim) 的 2D 张量。输出为形如 (nb_samples, …, units) 的 nD 张量,最常见的情况为 (nb_samples, output_dim) 的 2D 张量。
# 作为sequential模型的第一层输入:
model = Sequential()
model.add(Dense(32, input_shape=(16,)))
# 模型输入shape为 (*, 16),输出shape (*, 32)
# 第一层之后,就不需要指定输入大小了
model.add(Dense(32))
Activation 层
激活层对一个层的输出施加激活函数。
keras.layers.core.Activation(activation)
- activation:将要使用的激活函数,为预定义激活函数名或一个 Tensorflow/Theano 的函数。
该层输入 shape 任意,当使用激活层作为第一层时,要指定 input_shape
。输出 shape 与输入 shape 相同。
Dropout 层
Dropout 层将在训练过程中每次更新参数时随机断开一定百分比(rate)的输入神经元,用于防止过拟合。
keras.layers.core.Dropout(rate, seed=None)
- rate:0~1 的浮点数,控制需要断开的神经元的比例
- seed:整数,使用的随机数种子
Flatten 层
Flatten 层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。Flatten 不影响 batch 的大小。
keras.layers.core.Flatten()
model = Sequential()
model.add(Convolution2D(64, 3, 3,
border_mode='same',
input_shape=(3, 32, 32)))
# model.output_shape == (None, 64, 32, 32)
model.add(Flatten())
# model.output_shape == (None, 65536)
卷积操作将 (3,32,32) 格式的图像数据转换成 (64,32,32) 格式,Flatten 的结果则是 64 × 32 × 32 = 65536。
Reshape 层
Reshape 层用来将输入 shape 转换为特定的 shape。
keras.layers.core.Reshape(target_shape)
- target_shape:目标 shape,为整数的 tuple,不包含样本数目的维度(batch 大小)
该层的输入 shape 任意,但必须固定。当使用该层为模型首层时,需要指定 input_shape
参数。输出 shape 为 (batch_size,)+target_shape
。
# 作为Sequential模型的第一层
model = Sequential()
model.add(Reshape((3, 4), input_shape=(12,)))
# model.output_shape == (None, 3, 4)
# 注: `None` 是样本数目维
# 作为Sequential模型的中间层
model.add(Reshape((6, 2)))
# model.output_shape == (None, 6, 2)
# 也支持 `-1` 作为维度
model.add(Reshape((-1, 2, 2)))
# model.output_shape == (None, 3, 2, 2)
卷积层
Conv1D 层
一维卷积层(即时域卷积),用以在一维输入信号上进行邻域滤波。当使用该层作为首层时,需要提供关键字参数 input_shape
。例如 (10,128)
代表一个长为 10 的序列,序列中每个信号为 128 向量。而 (None, 128)
代表变长的 128 维向量序列。
该层生成将输入信号与卷积核按照单一的空域(或时域)方向进行卷积。如果 use_bias=True
,则还会加上一个偏置项,若 activation
不为 None,则输出为经过激活函数的输出。
keras.layers.convolutional.Conv1D(filters, kernel_size, strides=1, padding='valid', dilation_rate=1, activation=None)
- filters:卷积核的数目(即输出的维度)
- kernel_size:整数或由单个整数构成的 list/tuple,卷积核的空域或时域窗长度
- strides:整数或由单个整数构成的 list/tuple,为卷积的步长。任何不为 1 的 strides 均与任何不为 1 的 dilation_rata 均不兼容
- padding:补 0 策略,为“valid”、“same” 或“causal”,“causal”将产生因果(膨胀的)卷积,即 output[t] 不依赖于 input[t+1:],当对不能违反时间顺序的时序信号建模时有用。“valid”代表只进行有效的卷积,即对边界数据不处理。“same”代表保留边界处的卷积结果,通常会导致输出 shape 与输入 shape 相同。
- activation:激活函数,为预定义的激活函数名。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:$a(x)=x$)
- dilation_rate:整数或由单个整数构成的list/tuple,指定dilated convolution中的膨胀比例。任何不为1的dilation_rata均与任何不为1的strides均不兼容。
该层输入 shape 为形如 (samples,steps,input_dim) 的 3D 张量。输出 shape 为形如 (samples,new_steps,nb_filter) 的 3D 张量,因为有向量填充的原因,steps
的值会改变。
可以将 Convolution1D 看作 Convolution2D 的快捷版,对 (10,32) 的信号进行 1D 卷积相当于对其进行卷积核为 (filter_length, 32) 的 2D 卷积。
Conv2D 层
二维卷积层,即对图像的空域卷积。该层对二维输入进行滑动窗卷积,当使用该层作为第一层时,应提供 input_shape
参数。例如 input_shape = (128,128,3)
代表 128×128 的彩色 RGB 图像(data_format=’channels_last’)。
keras.layers.convolutional.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None)
- filters:卷积核的数目(即输出的维度)
- kernel_size:单个整数或由两个整数构成的 list/tuple,卷积核的宽度和长度。如为单个整数,则表示在各个空间维度的相同长度。
- strides:单个整数或由两个整数构成的 list/tuple,为卷积的步长。如为单个整数,则表示在各个空间维度的相同步长。任何不为 1 的strides均与任何不为 1 的 dilation_rata 均不兼容
- padding:补 0 策略,为“valid”, “same” 。“valid”代表只进行有效的卷积,即对边界数据不处理。“same”代表保留边界处的卷积结果,通常会导致输出 shape 与输入 shape 相同。
- activation:激活函数,为预定义的激活函数名。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:$a(x)=x$)
- dilation_rate:单个整数或由两个个整数构成的 list/tuple,指定 dilated convolution 中的膨胀比例。任何不为 1 的 dilation_rata 均与任何不为 1 的 strides 均不兼容。
- data_format:字符串,“channels_first”或“channels_last”之一,代表图像的通道维的位置。以 128×128 的 RGB 图像为例,“channels_first”应将数据组织为 (3,128,128),而“channels_last”应将数据组织为 (128,128,3)。该参数的默认值是
~/.keras/keras.json
中设置的值,若从未设置过,则为“channels_last”。
该层输入 shape 在“channels_first”模式下,输入形如 (samples,channels,rows,cols) 的 4D 张量,在“channels_last”模式下,输入形如 (samples,rows,cols,channels) 的 4D 张量。
注意:这里的输入 shape 指的是函数内部实现的输入 shape,而非函数接口应指定的
input_shape
。
输出 shape 在“channels_first”模式下,为形如 (samples,nb_filter, new_rows, new_cols) 的 4D 张量,在“channels_last”模式下,为形如 (samples,new_rows, new_cols,nb_filter) 的 4D 张量。输出的行列数可能会因为填充方法而改变。
池化层
MaxPooling1D 层
对时域 1D 信号进行最大值池化。
keras.layers.pooling.MaxPooling1D(pool_size=2, strides=None, padding='valid')
- pool_size:整数,池化窗口大小
- strides:整数或 None,下采样因子,例如设 2 将会使得输出 shape 为输入的一半,若为 None 则默认值为pool_size。
- padding:“valid”或者“same”
该层输入 shape 为形如 (samples,steps,features) 的 3D 张量,输出 shape 为形如 (samples,downsampled_steps,features) 的 3D 张量。
MaxPooling2D 层
为空域信号施加最大值池化。
keras.layers.pooling.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
- pool_size:整数或长为 2 的整数 tuple,代表在两个方向(竖直,水平)上的下采样因子,如取 (2,2) 将使图片在两个维度上均变为原长的一半。为整数意为各个维度值相同且为该数字。
- strides:整数或长为 2 的整数 tuple,或者 None,步长值。
- border_mode:“valid”或者“same”
- data_format:字符串,“channels_first”或“channels_last”之一,代表图像的通道维的位置。以 128×128 的 RGB 图像为例,“channels_first”应将数据组织为 (3,128,128),而“channels_last”应将数据组织为 (128,128,3)。该参数的默认值是
~/.keras/keras.json
中设置的值,若从未设置过,则为“channels_last”。
该层输入 shape 在“channels_first”模式下,为形如 (samples,channels, rows,cols) 的 4D 张量,在“channels_last”模式下,为形如 (samples,rows, cols,channels) 的 4D 张量。输出 shape 在“channels_first”模式下,为形如 (samples,channels, pooled_rows, pooled_cols) 的 4D 张量,在“channels_last”模式下,为形如 (samples,pooled_rows, pooled_cols,channels) 的4D张量。
AveragePooling1D 层
对时域 1D 信号进行平均值池化。
keras.layers.pooling.AveragePooling1D(pool_size=2, strides=None, padding='valid')
- pool_size:整数,池化窗口大小
- strides:整数或 None,下采样因子,例如设 2 将会使得输出 shape 为输入的一半,若为 None 则默认值为 pool_size。
- padding:“valid”或者“same”
该层输入 shape 为形如 (samples,steps,features) 的 3D 张量,输出 shape 为形如 (samples,downsampled_steps,features) 的 3D 张量。
AveragePooling2D 层
为空域信号施加平均值池化。
keras.layers.pooling.AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None)
- pool_size:整数或长为 2 的整数 tuple,代表在两个方向(竖直,水平)上的下采样因子,如取 (2,2) 将使图片在两个维度上均变为原长的一半。为整数意为各个维度值相同且为该数字。
- strides:整数或长为 2 的整数tuple,或者 None,步长值。
- border_mode:“valid”或者“same”
- data_format:字符串,“channels_first”或“channels_last”之一,代表图像的通道维的位置。以 128×128 的 RGB 图像为例,“channels_first”应将数据组织为 (3,128,128),而“channels_last”应将数据组织为 (128,128,3)。该参数的默认值是
~/.keras/keras.json
中设置的值,若从未设置过,则为“channels_last”。
该层输入 shape 在“channels_first”模式下,为形如 (samples,channels, rows,cols) 的 4D 张量,在“channels_last”模式下,为形如 (samples,rows, cols,channels) 的 4D 张量。输出 shape 在“channels_first”模式下,为形如 (samples,channels, pooled_rows, pooled_cols) 的 4D 张量,在“channels_last”模式下,为形如 (samples,pooled_rows, pooled_cols,channels) 的 4D 张量。
GlobalMaxPooling1D 层
对于时间信号的全局最大池化。
keras.layers.pooling.GlobalMaxPooling1D()
该层输入 shape 为形如 (samples,steps,features) 的 3D 张量,输出 shape 为形如 (samples, features) 的 2D 张量。
GlobalAveragePooling1D 层
为时域信号施加全局平均值池化。
keras.layers.pooling.GlobalAveragePooling1D()
该层输入 shape 为形如 (samples,steps,features) 的 3D 张量,输出 shape 为形如 (samples, features) 的 2D 张量。
GlobalMaxPooling2D 层
为空域信号施加全局最大值池化。
keras.layers.pooling.GlobalMaxPooling2D(data_format=None)
- data_format:字符串,“channels_first”或“channels_last”之一,代表图像的通道维的位置。以 128×128 的 RGB 图像为例,“channels_first”应将数据组织为 (3,128,128),而“channels_last”应将数据组织为 (128,128,3)。该参数的默认值是
~/.keras/keras.json
中设置的值,若从未设置过,则为“channels_last”。
该层输入 shape 在“channels_first”模式下,为形如 (samples,channels, rows,cols) 的 4D 张量,在“channels_last”模式下,为形如 (samples,rows, cols,channels) 的 4D 张量。输出 shape 为形如 (nb_samples, channels) 的 2D 张量。
GlobalAveragePooling2D 层
为空域信号施加全局平均值池化。
keras.layers.pooling.GlobalAveragePooling2D(data_format=None)
- data_format:字符串,“channels_first”或“channels_last”之一,代表图像的通道维的位置。以 128×128 的 RGB 图像为例,“channels_first”应将数据组织为 (3,128,128),而“channels_last”应将数据组织为 (128,128,3)。该参数的默认值是
~/.keras/keras.json
中设置的值,若从未设置过,则为“channels_last”。
该层输入 shape 在“channels_first”模式下,为形如 (samples,channels, rows,cols) 的 4D 张量,在“channels_last”模式下,为形如 (samples,rows, cols,channels) 的 4D 张量。输出 shape 为形如 (nb_samples, channels) 的 2D 张量。
循环层
Recurrent 层
这是循环层的抽象类,请不要在模型中直接应用该层(因为它是抽象类,无法实例化任何对象)。请使用它的子类 LSTM、GRU 或 SimpleRNN,这些循环层都服从本层的性质,并接受本层指定的所有关键字参数。
keras.layers.recurrent.Recurrent(return_sequences=False, go_backwards=False, stateful=False)
- return_sequences:布尔值,默认
False
,控制返回类型。若为True
则返回整个序列,否则仅返回输出序列的最后一个输出 - go_backwards:布尔值,默认为
False
,若为True
,则逆向处理输入序列并返回逆序后的序列 - stateful:布尔值,默认为
False
,若为True
,则一个 batch 中下标为 i 的样本的最终状态将会用作下一个 batch 同样下标的样本的初始状态 - input_dim:输入维度,当使用该层为模型首层时,应指定该值(或等价的指定 input_shape)
- input_length:当输入序列的长度固定时,该参数为输入序列的长度。当需要在该层后连接
Flatten
层,然后又要连接Dense
层时,需要指定该参数,否则全连接的输出无法计算出来。注意,如果循环层不是网络的第一层,你需要在网络的第一层中指定序列的长度(通过input_shap
指 定)。
该层输入 shape 为形如 (samples,timesteps,input_dim) 的 3D 张量。输出 shape 如果 return_sequences=True
则返回形如 (samples,timesteps,output_dim) 的 3D 张量,否则返回形如 (samples,output_dim) 的 2D 张量。
# 作为Sequential模型的第一层
model = Sequential()
model.add(LSTM(32, input_shape=(10, 64)))
# model.output_shape == (None, 32)
# 注意: `None` 是batch维.
# 下面是完全相同的:
model = Sequential()
model.add(LSTM(32, input_dim=64, input_length=10))
# 作为中间层, 不需要再去定义输入大小:
model.add(LSTM(16))
# 要堆叠循环层,必须设置输出到其他循环层的循环层 return_sequences=True
# 注意你只需在第一层上定义输入大小
model = Sequential()
model.add(LSTM(64, input_dim=64, input_length=10, return_sequences=True))
model.add(LSTM(32, return_sequences=True))
model.add(LSTM(10))
循环层支持通过时间步变量对输入数据进行 Masking,如果想将输入数据的一部分屏蔽掉,请使用 Embedding 层并将参数 mask_zero
设为 True。
可以将 RNN 设置为“stateful”,意味着由每个 batch 计算出的状态都会被重用于初始化下一个 batch 的初始状态。状态 RNN 假设连续的两个 batch 之中,相同下标的元素有一一映射关系。要启用状态 RNN,请在实例化层对象时指定参数 stateful=True
,并在 Sequential 模型使用固定大小的 batch:通过在模型的第一层传入 batch_size=(...)
和 input_shape
来实现。在函数式模型中,对所有的输入都要指定相同的 batch_size
。
SimpleRNN 层
全连接 RNN 网络,RNN 的输出会被回馈到输入。
keras.layers.recurrent.SimpleRNN(units, activation='tanh', dropout=0.0, recurrent_dropout=0.0)
- units:输出维度
- activation:激活函数,为预定义的激活函数名
- dropout:0~1 之间的浮点数,控制输入线性变换的神经元断开比例
- recurrent_dropout:0~1 之间的浮点数,控制循环状态的线性变换的神经元断开比例
GRU 层
门限循环单元。
keras.layers.recurrent.GRU(units, activation='tanh', recurrent_activation='hard_sigmoid', dropout=0.0, recurrent_dropout=0.0)
- units:输出维度
- activation:激活函数,为预定义的激活函数名
- recurrent_activation: 为循环步施加的激活函数
- dropout:0~1 之间的浮点数,控制输入线性变换的神经元断开比例
- recurrent_dropout:0~1 之间的浮点数,控制循环状态的线性变换的神经元断开比例
LSTM 层
Keras 长短期记忆模型。
keras.layers.recurrent.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', dropout=0.0, recurrent_dropout=0.0)
- units:输出维度
- activation:激活函数,为预定义的激活函数名
- recurrent_activation: 为循环步施加的激活函数
- dropout:0~1 之间的浮点数,控制输入线性变换的神经元断开比例
- recurrent_dropout:0~1 之间的浮点数,控制循环状态的线性变换的神经元断开比例
嵌入层
Embedding 层
嵌入层将正整数(下标)转换为具有固定大小的向量,如 [[4],[20]]->[[0.25,0.1],[0.6,-0.2]]。Embedding 层只能作为模型的第一层。
keras.layers.embeddings.Embedding(input_dim, output_dim, mask_zero=False, input_length=None)
- input_dim:大或等于 0 的整数,字典长度
- output_dim:大于 0 的整数,代表全连接嵌入的维度
- mask_zero:布尔值,确定是否将输入中的‘0’看作是应该被忽略的‘填充’(padding)值,该参数在使用循环层处理变长输入时有用。设置为
True
的话,模型中后续的层必须都支持 masking,否则会抛出异常。如果该值为 True,则下标 0 在字典中不可用,input_dim
应设置为|vocabulary| + 2
。 - input_length:当输入序列的长度固定时,该值为其长度。如果要在该层后接
Flatten
层,然后接Dense
层,则必须指定该参数,否则Dense
层的输出维度无法自动推断。
该层输入 shape 为形如 (samples,sequence_length) 的 2D 张量,输出 shape 为形如 (samples, sequence_length, output_dim) 的 3D 张量。
model = Sequential()
model.add(Embedding(1000, 64, input_length=10))
# 模型会接收一个(batch, input_length)的整数矩阵.
# 输入中的最大的整数 (词语索引) 应该不大于 999 (词表大小).
# model.output_shape == (None, 10, 64), None是batch维.
input_array = np.random.randint(1000, size=(32, 10))
model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)
assert output_array.shape == (32, 10, 64)
融合层
Merge 层提供了一系列用于融合两个层或两个张量的层对象和方法。以大写首字母开头的是 Layer 类,以小写字母开头的是张量的函数。小写字母开头的张量函数在内部实际上是调用了大写字母开头的层。
Add 层
该层接收一个列表的同 shape 张量,并返回它们的和,shape 不变。
keras.layers.merge.Add()
该层的函数式包装为:add(inputs)
,inputs 为长度至少为 2 的张量列表。
Multiply 层
该层接收一个列表的同 shape 张量,并返回它们的逐元素积的张量,shape 不变。
keras.layers.merge.Multiply()
该层的函数式包装为:multiply(inputs)
,inputs 为长度至少为 2 的张量列表。
Average 层
该层接收一个列表的同 shape 张量,并返回它们的逐元素均值,shape 不变。
keras.layers.merge.Average()
该层的函数式包装为:average(inputs)
,inputs 为长度至少为 2 的张量列表。
Maximum 层
该层接收一个列表的同 shape 张量,并返回它们的逐元素最大值,shape 不变。
keras.layers.merge.Maximum()
该层的函数式包装为:maximum(inputs)
,inputs 为长度至少为 2 的张量列表。
Concatenate 层
该层接收一个列表的同 shape 张量,并返回它们的按照给定轴相接构成的向量。
keras.layers.merge.Concatenate(axis=-1)
- axis: 想接的轴
该层的函数式包装为:concatenate(inputs, axis=-1))
,inputs 为长度至少为2的张量列,axis 为相接的轴。
Dot 层
计算两个 tensor 中样本的张量乘积。例如,如果两个张量 a
和 b
的 shape 都为 (batch_size, n),则输出为形如 (batch_size,1) 的张量,结果张量每个 batch 的数据都是 a[i,:] 和 b[i,:] 的矩阵(向量)点积。
keras.layers.merge.Dot(axes, normalize=False)
- axes: 整数或整数的 tuple,执行乘法的轴。
- normalize: 布尔值,是否沿执行成绩的轴做 L2 规范化,如果设为 True,那么乘积的输出是两个样本的余弦相似性。
该层的函数式包装为:dot(inputs, axes, normalize=False)
。inputs 为长度至少为2的张量列;axes 为整数或整数的 tuple,执行乘法的轴;normalize 为布尔值,是否沿执行成绩的轴做L2规范化,如果设为True,那么乘积的输出是两个样本的余弦相似性。
本文整理自《Keras中文文档》