【发布时间】:2019-04-06 05:43:03
【问题描述】:
我正在尝试在 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()
然后我使用 ResNet50 preprocess_input 函数创建输入数据:x_batch,以及一个热编码标签 y_batch,然后进行拟合:
model.fit(x_batch,
y_batch,
epochs=nb_epochs,
batch_size=64,
shuffle=True,
validation_split=0.2,
callbacks=[lrate])
经过十个左右的 epoch,训练准确率接近 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)
然后验证准确率达到 85% 左右......这是怎么回事?为什么图片输入法不起作用?
更新:
这个问题真的很奇怪。如果我将 ResNet50 更改为 VGG19,它似乎可以正常工作。
【问题讨论】:
-
检查第一种情况和第二种情况下的可训练层数。它们是一样的吗?
-
@dgumo 是的,它们是一样的
-
是的,可训练参数的数量匹配(大约 2400 万个参数,2300 万个不可训练,130 万个可训练)
标签: python tensorflow keras