Sequential
是多个网络层的线性堆叠
可以通过向Sequential
模型传递一个layer的list来构造该模型:
也可以通过.add()
方法一个个的将layer加入模型中:
模型需要知道输入数据的shape,因此,Sequential
的第一层需要接受一个关于输入数据shape的参数,后面的各个层则可以自动的推导出中间数据的shape,因此不需要为每个层都指定这个参数。有几种方法来为第一层指定输入数据的shape
input_shape
的关键字参数给第一层,input_shape
是一个tuple类型的数据,其中也可以填入None
,如果填入None
则表示此位置可能是任何正整数。数据的batch大小不应包含在其中。batch_input_shape
的关键字参数给第一层,该参数包含数据的batch大小。该参数在指定固定大小batch时比较有用,例如在stateful RNNs中。事实上,Keras在内部会通过添加一个None将input_shape转化为batch_input_shapeDense
,支持通过指定其输入维度input_dim
来隐含的指定输入数据shape。一些3D的时域层支持通过参数input_dim
和input_length
来指定输入shape。下面的三个指定输入数据shape的方法是严格等价的:
下面三种方法也是严格等价的:
多个Sequential
可经由一个Merge层合并到一个输出。Merge层的输出是一个可以被添加到新Sequential
的层对象。下面这个例子将两个Sequential合并到一起:
Merge层支持一些预定义的合并模式,包括:
sum
(defualt):逐元素相加concat
:张量串联,可以通过提供concat_axis
的关键字参数指定按照哪个轴进行串联mul
:逐元素相乘ave
:张量平均dot
:张量相乘,可以通过dot_axis
关键字参数来指定要消去的轴cos
:计算2D张量(即矩阵)中各个向量的余弦距离这个两个分支的模型可以通过下面的代码训练:
final_model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
final_model.fit([input_data_1, input_data_2], targets) # we pass one data array per model input
也可以为Merge层提供关键字参数mode
,以实现任意的变换,例如:
merged = Merge([left_branch, right_branch], mode=lambda x, y: x - y)
现在你已经学会定义几乎任何Keras的模型了,对于不能通过Sequential和Merge组合生成的复杂模型,可以参考泛型模型API
在训练模型之前,我们需要通过compile
来对学习过程进行配置。compile
接收三个参数:
rmsprop
、adagrad
,或一个Optimizer
类的对象,详情见optimizerscategorical_crossentropy
、mse
,也可以为一个损失函数。详情见objectivesmetrics=['accuracy']
。指标可以是一个预定义指标的名字(目前仅支持accuracy
),也可以是一个一般的函数。
Keras以Numpy数组作为输入数据和标签的数据类型。训练模型一般使用fit
函数,该函数的详情见这里。下面是一些例子。
这里是一些帮助你开始的例子
在Keras代码包的examples文件夹中,你将找到使用真实数据的示例模型:
类似VGG的卷积神经网络:
(单词级别嵌入,描述语句最多16个单词)
注意,要使该网络良好工作需要更大规模的卷积神经网络并以预训练权重初始化,此处仅为结构示例。
在该模型中,我们将三个LSTM堆叠在一起,是该模型能够学习更高层次的时域特征表示。
开始的两层LSTM返回其全部输出序列,而第三层LSTM只返回其输出序列的最后一步结果,从而其时域维度降低(即将输入序列转换为单个向量)
状态(stateful)LSTM的特点是,在处理过一个batch的训练数据后,其内部状态(记忆)会被作为下一个batch的训练数据的初始状态。状态LSTM使得我们可以在合理的计算复杂度内处理较长序列
请FAQ中关于状态LSTM的部分获取更多信息
将两个LSTM合并作为编码端来处理两路序列的分类
在本模型中,两路输入序列通过两个LSTM被编码为特征向量
两路特征向量被串连在一起,然后通过一个全连接网络得到结果,示意图如下:
本文摘自keras-cn 文档 http://keras-cn.readthedocs.io/