python - 迁移学习(VGG16)在 CIFAR-10 上表现更差是正常的吗?
问题描述
注意:我不确定这是提出此类问题的正确网站。请告诉我在否决这个“因为这不是问的正确地方”之前我应该在哪里问他们。谢谢!
我目前正在尝试使用Keras进行深度学习。我已经尝试了一种类似于Keras 示例中的模型。这会产生预期的结果:
- 80% 在 10-15 个 epoch 之后没有数据增强,然后在第 15 个 epoch 左右过度拟合
- 80% 在 50 个 epoch 后数据增强,没有任何过度拟合的迹象。
在此之后,我想尝试迁移学习。我通过使用VGG16网络而不重新训练其权重来做到这一点(参见下面的代码)。这给出了非常差的结果:10 个时期后的准确度为 63%,曲线非常浅(见下图),这似乎表明只有在很长的训练时间后(如果有的话)才能达到可接受的结果(我预计 200- 300 个 epoch 才达到 80%)。
这是这种应用程序的正常行为吗?以下是我可以想象的导致这些不良结果的原因:
- CIFAR-10 数据集包含
32x32
像素图像,对于 VGG16 网络来说可能太少了 - VGG16 的过滤器不适用于 CIFAR-10,可以通过将权重设置为
trainable
或从随机权重开始(仅复制模型而不是权重)来解决
提前致谢!
我的代码:
请注意,输入是 2 个数据集(50000 个训练图像和 10000 个测试图像),它们被标记为形状为 的图像32x32x3
。每个像素值都是 range 中的浮点数[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 使用
推荐阅读
- r - as.character() 应用于 data.frame 的单个元素与 data.frame 的整个“行”
- c# - Picturebox.bounds.intersectswith 不起作用
- python - 如何在实时 Django 网站上进行更改?
- xaml - 使用 MVVM 时,在 View 中为对象设置动画的最佳方法是什么?
- xamarin.forms - Xamarin 形成 Android 帧渲染器和角半径
- flutter - 如何在颤动中上传图像
- docker - Docker - Docker 在使用 $PWD 时抱怨:在 Windows 10 Pro 中
- matlab - 周期时间 Simulink
- postgresql - 使用 flask_sqlalchemy 创建数据库失败
- python - Python:无法解释的无效语法错误