迁移学习 (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 进行深度学习实验。这会产生预期的结果:
- 80% 在 10-15 个时期之后没有数据增强,然后在第 15 个时期左右过度拟合并且
- 80% 在 50 个 epochs 数据增强后没有任何过度拟合的迹象。
之后我想尝试迁移学习。我通过使用 VGG16 网络而不重新训练它的权重来做到这一点(见下面的代码)。这给出了非常糟糕的结果:10 个 epoch 后的准确率为 63%,曲线非常浅(见下图),这似乎表明它只有在经过很长的训练时间(我预计 200-在达到 80% 之前需要 300 个纪元。
对于此类应用程序,这是正常行为吗?以下是我认为导致这些不良结果的一些原因:
- CIFAR-10 数据集有
32x32
像素的图像,这对于 VGG16 网络来说可能太少了
- VGG16 的过滤器不适用于 CIFAR-10,这可以通过将权重设置为
trainable
或从随机权重开始(仅复制模型而不复制权重)来解决
提前致谢!
我的代码:
请注意,输入是 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,通过放大后者,效果相当好,但这并不理想。
其次,目标数据集有那么多训练示例,冻结所有传输的层不太可能是一个好的解决方案,实际上将所有层设置为可训练可能效果最好。
注意:我不确定这是问这类问题的正确网站。请告诉我在否决这个 "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 进行深度学习实验。这会产生预期的结果:
- 80% 在 10-15 个时期之后没有数据增强,然后在第 15 个时期左右过度拟合并且
- 80% 在 50 个 epochs 数据增强后没有任何过度拟合的迹象。
之后我想尝试迁移学习。我通过使用 VGG16 网络而不重新训练它的权重来做到这一点(见下面的代码)。这给出了非常糟糕的结果:10 个 epoch 后的准确率为 63%,曲线非常浅(见下图),这似乎表明它只有在经过很长的训练时间(我预计 200-在达到 80% 之前需要 300 个纪元。
对于此类应用程序,这是正常行为吗?以下是我认为导致这些不良结果的一些原因:
- CIFAR-10 数据集有
32x32
像素的图像,这对于 VGG16 网络来说可能太少了 - VGG16 的过滤器不适用于 CIFAR-10,这可以通过将权重设置为
trainable
或从随机权重开始(仅复制模型而不复制权重)来解决
提前致谢!
我的代码:
请注意,输入是 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,通过放大后者,效果相当好,但这并不理想。
其次,目标数据集有那么多训练示例,冻结所有传输的层不太可能是一个好的解决方案,实际上将所有层设置为可训练可能效果最好。