Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 转移学习(VGG16)在CIFAR-10上表现较差,这正常吗?_Python_Keras_Deep Learning_Image Recognition_Transfer Learning - Fatal编程技术网

Python 转移学习(VGG16)在CIFAR-10上表现较差,这正常吗?

Python 转移学习(VGG16)在CIFAR-10上表现较差,这正常吗?,python,keras,deep-learning,image-recognition,transfer-learning,Python,Keras,Deep Learning,Image Recognition,Transfer Learning,注意:我不确定这是问这类问题的合适网站。请告诉我,在投票否决之前,我应该在哪里问他们“因为这不是问问题的正确地方”。谢谢 我目前正在尝试使用。我已经试过了一个类似的模型。这将产生预期的结果: 10-15个历元后的80%,在第15个历元前后过度拟合之前无数据增加,以及 50个时代后的80%,数据增加,没有任何过度拟合的迹象 在此之后,我想尝试迁移学习。我这样做是通过使用网络而没有重新训练它的权重(参见下面的代码)。这导致了非常糟糕的结果:使用非常浅的曲线(见下图)进行10个历次后,准确率为63

注意:我不确定这是问这类问题的合适网站。请告诉我,在投票否决之前,我应该在哪里问他们“因为这不是问问题的正确地方”。谢谢

我目前正在尝试使用。我已经试过了一个类似的模型。这将产生预期的结果:

  • 10-15个历元后的80%,在第15个历元前后过度拟合之前无数据增加,以及
  • 50个时代后的80%,数据增加,没有任何过度拟合的迹象
在此之后,我想尝试迁移学习。我这样做是通过使用网络而没有重新训练它的权重(参见下面的代码)。这导致了非常糟糕的结果:使用非常浅的曲线(见下图)进行10个历次后,准确率为63%,这似乎表明,经过很长的训练时间(我预计在达到80%之前进行200-300个历次)后,它将仅能获得可接受的结果(如果有)

这是这种应用程序的正常行为吗?以下是一些我可以想象的导致这些糟糕结果的原因:

  • CIFAR-10数据集具有
    32x32
    像素的图像,这对于VGG16网络来说可能太少了
  • VGG16的过滤器不适用于CIFAR-10,可通过将权重设置为
    可训练
    或从随机权重开始(仅复制模型而非权重)来解决该问题
提前谢谢


我的代码:

请注意,输入是2个数据集(50000个训练图像和10000个测试图像),这些数据集是带有形状标签的图像
32x32x3
。每个像素值都是范围
[0.0,1.0]
内的浮点值

导入keras
#加载和预处理数据。。。
#获取VGG16基本模型并定义新的输入形状
vgg16=keras.applications.vgg16.vgg16(输入_形状=(32,32,3),
权重='imagenet',
include_top=False)
#在顶部添加新的密集层
x=keras.layers.flatte()(vgg16.output)
x=keras.layers.Dense(1024,活化='relu')(x)
x=keras.层压降(0.5)(x)
x=keras.layers.Dense(128,活化='relu')(x)
预测=keras.layers.density(10,活化='softmax')(x)
#定义和编译模型
模型=keras.model(输入=vgg16.inputs,输出=预测)
对于vgg16.layers中的层:
layer.trainable=错误
model.compile(优化器='adam',
损失class='classifical_crossentropy',
指标=[‘准确度’])
#培训和验证
模型安装(x_系列、y_系列、,
批次大小=256,
纪元=10,
验证数据=(x_检验,y_检验)
模型评估(x_检验,y_检验)

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

这不是VGG16型号无法使用该输入尺寸,而是您使用的权重已在不同的输入尺寸(imagenet)上进行了预训练。您需要源数据集和目标数据集具有相同的输入大小,以便预先训练的权重可以传递。因此,您可以使用重新缩放的imagenet图像对32x32x3进行预训练,也可以选择一个与预训练大致相同的目标数据集(通常是224x224x3或imagenet的类似数据集),并进行缩放以匹配。我最近看到一篇文章,他们通过放大cifar10和100从imagenet转移到cifar10和100,后者工作得相当好,但这并不理想

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