在keras中主要有两大类深度学习模型: 一类是序列模型(Sequential);另一类是通用模型(Model),其中的差异主要体现在拓扑结构上.

序列模型

可以说序列模型是通用模型的一个子类,这种模型各层之间是依次顺序的线性关系,通常是叠加形式构造深度学习模型,比如:

1
2
3
4
5
6
7
8
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"))

通用模型

通用模型可以用来设计比较复杂,任意结构的深度学习模型,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from keras.layers import Input,Dense
from keras.models import Model

# 定义输入层,主要是为了定义输入的多维矩阵的尺寸
# 这里的(784,) 相当于把每一个图像都拉平为784个像素点的向量
input = Input(shape = (784,))
# 定义各个连接层
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(optimizer='rmsprop',loss = 'categorical_crossentropy',metrics = ['accuracy'])
# 进行模型拟合
model.fit(data,labels)

可以看到,对于序列模型跟通用模型,他们的主要差异是在于如何定义从输入层到输出层的各层结构:

  • 首先,在序列模型中,是先定义序列模型对象;而在通用模型中是先定义从输入层到输出层各层要素,然后在定义模型对象.
  • 其次,在序列模型中,当有了一个模型对象之后,通过add方式依次添加各层信息;而在通用模型中,通过不断的封装各层模型结构的函数作为参数来定义模型结构.
  • 最后,在序列模型中,各层只能依次线性添加;而在通用模型中,采用了封装的概念,可以定义出很复杂的网络模型.