在Keras中设定了两类深度学习模型,区别在于不同的拓扑结构:
- 序列模型(Sequential类)
- 通用模型(Model类)
一、序列模型
方法一:一次性定义层
from Keras.models import Sequential
from Keras.layers import Dense,Activation
layers = [Dense(32,input_shape = (784,)),
Activation('relu'),
Dense(10);
Activation('softmax')]
model = Sequential(layers)
注意:到底使用input_shape还是input_dim?
下面两种等价
model.add(Dense(32, input_shape=(784,)))
model.add(Dense(32, input_dim=784))
来源:Keras中文文档
方法二:逐行添加层
from Keras.models import Sequential
from Keras.layers import Dense,Activation
model = Sequential()
model.add(Dense(32,input_shape=(784,)))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))
注意:以下两段代码等价
model.add(Dense(64,input_shape=(784,)))
model.add(Activation('tanh'))
model.add(Dense(64,input_shape=(784,),activation = 'tanh'))
二、通用模型
通用模型可以用来设计非常复杂、任意拓扑结构都的神经网络,例如有向无环网络、共享网络等。类似于序列模型,通用模型通过函数化得应用接口来定义模型。在定义的时候,从输入的多维矩阵开始,然后定义各层要素,最后定义输出层。将输入层和输出层作为参数纳入通用模型中就可以定义一个模型对象,并进行编译和拟合。
下面的例子来自于《Keras手册》,用一个全连接神经网络拟合一个手写阿拉伯数字的分类模型。输入的数据为28x28的图像。
- 载入相关模块
- 定义输入层
- 定义各连接层,包括相应的激活函数
- 定义输出层
- 定义模型对象
- 编译和拟合
一、载入相关模块
from Keras.layers ipmort Input, Dense
from Keras.models import Model
二、定义输入层
主要是为了定义输入的多维矩阵的尺寸。在这里因为每一个图像都被拉平为784个像素点的向量,因此这个多维矩阵的尺寸就是(784,)的向量
input = Input(shape = (784,))
三、定义各连接层,包括相应的激活函数
假设从输入层开始,定义两个隐含层,都有64个神经元,都使用relu激活函数。
x = Dense(64,activation='relu')(input)
x = Dense(64,activation='relu')(x)
第一个隐藏层使用输入层作为参数,而第二个隐藏层使用第一个隐藏层作为参数,体现了函数式编程的优点
四、定义输出层
使用最近的隐藏层作为参数
y = Dense(10, activation='softmax')(x)
五、定义模型对象
model = Model(inputs = input, outputs = y);
六、编译和拟合
model.compile(optimazer='rmsprop', loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(data,labels)
序列模型VS通用模型(如何定义各层结构)
序列模型 | 通用模型 | |
1 | 先定义序列模型对象 | 先定义从输入层到输出层各层要素,包括尺寸结构 |
2 | 通过add方法添加各层信息 | 通过不停地封装含有各层网络结构的函数作为参数来定义网络结构的 |
3 | 各层只能依次线性添加 | 因为采用了函数封装的概念,可以在原有的网络结构上应用新的结构来快速生成新的模型,因此灵活度搞很多,特别是在具有多种类型的输入数据的情况下。 《Keras手册》例子:教神经网络看视频进行问答 这个例子的输入数据有两种:视频图像和自然语言的提问。 步骤: 1.构造多层卷积神经网络使用序列模型来对图像编码 2.将这个模型放入TimeDistributed函数中建立视频编 3.使用LSTM对编码建模,同时对自然语言进行从文字到向量的转换 4.合并两个网络 5.将合并的网络作为参数输入到下一个全连接层进行计算 6.输出可能的回答
|
结论:虽然大部分工作可以用序列模型来应对,但是函数式接口的通用模型为分析师提供了更强大的工具
参考文献
书籍《Keras快速上手:基于Python的深度学习实战》
书籍《深度学习 基于Keras的Python实战》
书籍《Keras手册》