迁移学习 (VGG16) 在 CIFAR-10 上表现较差是否正常?

Is it normal that transfer learning (VGG16) performs worse on CIFAR-10?

注意:我不确定这是问这类问题的正确网站。请告诉我在否决这个 "because this isn't the right place to ask" 之前我应该​​在哪里问他们。谢谢!

我目前正在使用 Keras. I tried already a model similar to the one to be found on the Keras example 进行深度学习实验。这会产生预期的结果:

之后我想尝试迁移学习。我通过使用 VGG16 网络而不重新训练它的权重来做到这一点(见下面的代码)。这给出了非常糟糕的结果:10 个 epoch 后的准确率为 63%,曲线非常浅(见下图),这似乎表明它只有在经过很长的训练时间(我预计 200-在达到 80% 之前需要 300 个纪元。

对于此类应用程序,这是正常行为吗?以下是我认为导致这些不良结果的一些原因:

提前致谢!


我的代码:

请注意,输入是 2 个数据集(50000 个训练图像和 10000 个测试图像),它们是形状为 32x32x3 的标记图像。每个像素值都是 [0.0, 1.0].

范围内的浮点数
import keras

# load and preprocess data...

# get VGG16 base model and define new input shape
vgg16 = keras.applications.vgg16.VGG16(input_shape=(32, 32, 3),
                                       weights='imagenet',
                                       include_top=False)

# add new dense layers at the top
x = keras.layers.Flatten()(vgg16.output)
x = keras.layers.Dense(1024, activation='relu')(x)
x = keras.layers.Dropout(0.5)(x)
x = keras.layers.Dense(128, activation='relu')(x)
predictions = keras.layers.Dense(10, activation='softmax')(x)

# define and compile model
model = keras.Model(inputs=vgg16.inputs, outputs=predictions)
for layer in vgg16.layers:
    layer.trainable = False
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# training and validation
model.fit(x_train, y_train,
          batch_size=256,
          epochs=10,
          validation_data=(x_test, y_test))

model.evaluate(x_test, y_test)

我认为 CIFAR-10 数据集有 32x32 像素的图像,这对于 VGG16 网络来说可能太少了 该程序不兼容 CIFAR-10 使用

并不是说 VGG16 模型不适用于该输入大小,而是您使用的权重已经在不同的输入大小 (imagenet) 上进行了预训练。您需要源数据集和目标数据集具有相同的输入大小,以便预训练的权重可以转移。因此,您可以使用重新调整为 32x32x3 的 imagenet 图像进行预训练,或者选择一个与预训练大致相同的目标数据集(通常为 224x224x3 或类似的 imagenet)并进行缩放以匹配。我最近看到一篇论文,他们从 imagenet 转移到 cifar10 和 100,通过放大后者,效果相当好,但这并不理想。

http://openaccess.thecvf.com/content_CVPR_2019/papers/Kornblith_Do_Better_ImageNet_Models_Transfer_Better_CVPR_2019_paper.pdf

其次,目标数据集有那么多训练示例,冻结所有传输的层不太可能是一个好的解决方案,实际上将所有层设置为可训练可能效果最好。