一般的方法是只采用预训练CNN的较低层(如ResNet),并在现有CNN的基础上添加新层。
一旦你有了模型,你可能应该在训练开始时锁定预训练层,这样你就不会破坏那些已经训练过的权重,然后在几个循环后,当梯度稳定下来时,你可以解锁这些层并继续训练。
删除预训练网络顶层的最简单方法是设置
include_top
论证到
False
.
base_model = ResNet50(include_top=False, weights="imagenet")
然后,您可以像往常一样开始添加图层,即(
n_classes
指要分类的类的数量)
my_hidden1 = keras.layers.Dense(128, activation="relu")(base_model)
# rest of the custom layers
...
output = keras.layers.Dense(n_classes, activation="softmax")(previous_layer)
model = keras.Model(inputs=base_model.input, outputs=output)
在开始时锁定预训练层
for layer in base_model.layers:
layer.trainable = False
那么你可以
compile
和
fit
你的新模型在几个时代(即使学习率更高),即。
optimizer = keras.optimizers.SGD(lr=0.2, momentum=0.9, decay=0.01)
model.compile(optimizer=optimizer, ...)
model.fit(...)
初始训练完成后,您可以解锁基础层并继续训练(通常,您希望在这个阶段降低学习率)。
for layer in base_model.layers:
layer.trainable = True
optimizer = keras.optimizers.SGD(lr=0.01, momentum=0.9, decay=0.001)
model.compile(...)
model.fit(...)
请注意,您必须运行
编译
每次锁定或解锁这些层时。