在Keras中微调InceptionV3

时间:2017-09-30 11:19:48

标签: machine-learning keras

我正在使用来自keras.applications的预训练的InceptionV3模型在Keras中使用转移学习实现卷积神经网络,如下所示

#Transfer learning with Inception V3
base_model = applications.InceptionV3(weights='imagenet', include_top=False, input_shape=(299, 299, 3))

## set model architechture
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x) 
predictions = Dense(y_train.shape[1], activation='softmax')(x) 
model = Model(input=base_model.input, output=predictions)

for layer in base_model.layers:
    layer.trainable = False

model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

model.summary()

我正在关注一篇博客文章说,在冻结基础模型后,模型必须经过几个时期的训练。我已经训练了5个时代的模型,给了我0.47的acc。之后,acc不会有太大改善。然后我停止了训练并解冻了这样的一些层并冻结了前2个卷积层。

for layer in model.layers[:172]:
   layer.trainable = False
for layer in model.layers[172:]:
   layer.trainable = True

使用较低学习率的SGD进行编译。

我的方法是停止训练模型,当acc不会因层冻结正确而得到很大改善。我应该接受更长时间的训练吗?

如何知道停止使用图层冻结训练的正确时间。?

1 个答案:

答案 0 :(得分:1)

恕我直言,你不必训练你的随机初始化层,直到损失/准确性停止改善。

当我使用InceptionV3进行微调时,我训练了我的额外密集层只有2个时期,即使再训练几个时期也很可能导致更好的损失/准确性。 初始培训的时期数取决于您的问题和数据。 (对我来说,2个时代达到了~40%。)

我认为长时间训练Dense层是浪费时间的。 训练它以获得随机初始化更好的东西。 然后解冻更多层,并与Dense层一起训练更长时间。 只要您的Dense图层给出合理的预测,就可以训练其他图层,特别是您在InceptionV3中有批量标准化,可以稳定早期图层的渐变方差。