我想在Keras做迁移学习。我设置了一个ResNet50网络,设置为不可训练,带有一些额外的层:
# Image input
model = Sequential()
model.add(ResNet50(include_top=False, pooling='avg')) # output is 2048
model.add(Dropout(0.05))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.15))
model.add(Dense(512, activation='relu'))
model.add(Dense(7, activation='softmax'))
model.layers[0].trainable = False
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()
然后我创建输入数据:
x_batch
使用ResNet50
preprocess_input
y_batch
并按如下方式安装:
model.fit(x_batch,
y_batch,
epochs=nb_epochs,
batch_size=64,
shuffle=True,
validation_split=0.2,
callbacks=[lrate])
经过10个周期左右的训练,训练准确率接近100%,但随着验证损失的不断增加,验证准确率实际上从50%左右下降到30%。
但是,如果我创建一个仅包含最后几层的网络:
# Vector input
model2 = Sequential()
model2.add(Dropout(0.05, input_shape=(2048,)))
model2.add(Dense(512, activation='relu'))
model2.add(Dropout(0.15))
model2.add(Dense(512, activation='relu'))
model2.add(Dense(7, activation='softmax'))
model2.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model2.summary()
并输入ResNet50预测的输出:
resnet = ResNet50(include_top=False, pooling='avg')
x_batch = resnet.predict(x_batch)
更新:
这个问题真奇怪。如果我把ResNet50改成VGG19,它看起来可以工作。