在Keras中有两种深度学习的模型:序列模型(Sequential)和通用模型(Model)。
差异在于不同的拓扑结构。
一. Sequential序列模型
序列模型各层之间是依次顺序的线性关系(多个网络层的线性堆叠),模型结构通过一个列表来制定,或者逐层添加网络结构。
1. 构造模型
通过将网络层实例的列表传递给 Sequential
的构造器,来创建一个 Sequential
模型。
# 导入类from keras.models
import Sequentialfrom keras.layers
import Dense, Activation
# 构建Sequential模型
# Model是keras最核心的数据结构
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
也可以简单地使用 .add()
方法将各层添加到模型中
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))
3. 指定输入数据的尺寸
指定输入数据的尺寸在第一层,模型需要知道它所期望的输入尺寸,在后面的层中,模型可以自动地推断尺寸。有三种方式指定输入数据的尺寸
1). 传递一个input_shape参数给第一层。它是一个表示尺寸的元组(一个由整数或None组成的元组,其中None表示可能为任何正整数)。在input_shape中不包含数据的batch大小。
2). 某些2D层,如Dense,支持通过参数input_dim指定输入尺寸;某些3D时序层支持input_dim和input_length参数。
3). 如果你需要为你的输入制定一个固定大小的batch(对stateful RNNs很有用),可以传递一个batch_size参数给一个层。如果你同时将batch_size=32和input_shape=(6,8)传递给一个层,那么每一批输入的尺寸就为(32,6,8)。
因此,如下代码是等价的:
1 |
|
1 |
|
2. 编译模型
在训练模型之前,通过 compile
方法配置学习过程,参数:
2.1. 优化器optimizer
1). 可以是现有优化器的字符串标识符(如rmsprop
或adagrad
),
2). 也可以是Optimizer
类的示例,参见optimizers;下图中的类都可以直接用
字符串标识符代表了Keras预定义的优化器函数类,它们与具体的优化器函数实现相关联
有两种写法:
1) 只写字符串
model.compile(optimizer= 'adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
2)用对应类的构造函数
model.compile(optimizer= tf.keras.optimizers.Adam(),#'adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
tf.keras.optimizers.Adam(), 调用了Adam类的构造函数,用的是默认参数值,参见 Adam
2.2. 损失函数loss
模型试图最小化的目标函数。
1). 可以是现有损失函数的字符串标识符(如categorical_crossentropy
或mse
)
2). 也可以是一个目标函数,见losses;
字符串标识符代表了Keras预定义的损失函数类,它们与具体的损失函数实现相关联
2.3. 评估标准metrics
对于任何分类问题,都希望将其设置为metrics = ['accuracy']
。可以是现有的字符串标识符,也可以是自定义的评估标准函数。
#分类问题
model.compile(
optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy']
)
#二分类问题
model.compile(
optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy']
)
#均方误差回归问题
model.compile(
optimizer='rmsprop',
loss='mse'
)
#自定义评估标准函数
import keras.backend as K
def mean_pred(y_true,y_pred):
return K.mean(y_pred)
model.compile(
optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy',mean_pred]
)
更多metrics,参见 metrics
3. 训练模型
在输入数据和标签的Numpy矩阵上进行训练。为了训练这一个模型,通常会使用 fit
函数,参见
x
和y
:分别代表输入数据和目标变量。batch_size
:每次更新使用的样本数。epochs
:整个数据集将被遍历的次数。validation_split
:验证集占训练集的比例,用于监控模型的性能并防止过拟合。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
二. Model通用模型
通用模型可以设计非常复杂、任意拓扑结构的神经网络,例如有向无环网络、共享层网络等。
相比于序列模型只能依次线性逐层添加,通用模型能够比较灵活地构造网络结构,设定各层级的关系。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|