3 回答
TA贡献1836条经验 获得超13个赞
我有类似的问题,在运行下面的小实验后,我认为您preprocess_input
在使用预训练模型时需要始终使用,而在从头开始训练时使用 rescale。
显然,当您直接使用预训练模型进行推理时,您必须使用preprocess_input
:例如我尝试resnet50
在kaggle dog-vs-cats数据集上使用,rescale=1./255
它返回索引 111(nematode, nematode worm, roundworm)
作为所有图像最可能的类,而使用preprocess_input
它主要返回与预期的狗和猫相对应的索引。
然后我试着用resnet50
用include_top=False
,从imagenet,一个冰冻的权重GlobalAveragePooling2D
层和一个最终的致密层乙状结肠。我与 Adam 在kaggle dog-vs-cats数据集的2000 张图像上对其进行了训练(并且我使用了 1000 张图像作为验证)。使用重新缩放它在 5 个时期后无法适应任何东西,它总是预测第一类(虽然奇怪的是训练准确度是97%,但是当我运行evaluate_generator`` on the training images, the accuracy is **50%**). But with
preprocess_input , it achieves **98%** accuracy on the validation set. Also note that you do not really need the images to be of the same dimensions as the trained models, for example if I use 150 instead of 224, I still get a **97.5%** accuracy. Without any rescaling or
preprocess_input` 时,我得到了95% 的验证准确度。
我试着用同样的事情vgg16
,与重新调整它并设法适应,但87% VS 97%使用preprocess_input
,并且95%没有任何东西。
然后我从头开始用 10 个 epoch 训练了一个小型 conv 网络,没有任何东西或使用resnet50
preprocess_input
,它根本不适合,但是通过重新缩放我得到了70% 的验证准确度。
TA贡献1803条经验 获得超3个赞
First I thought using rescale=1./255 only works when dealing with a pretrained vgg16 model, but I keep seeing examples where it is being used with pre-trained resetnet50, inception etc. as well.
这样做的原因是因为您需要规范化您的输入。通常最小-最大归一化的公式是
这相当于做
1./255
由于图像的像素值将在 0 和 1 之间
对输入进行归一化的原因与数值稳定性和收敛性有关(技术上你不需要它,但有了它,神经网络有更高的收敛机会,梯度下降/亚当算法更有可能稳定)
根据Does this only make a difference when using pretrained-models i.e. with loaded weights vs training from scratch?
否,它不仅仅与预训练模型相关联,这是在机器学习中使用某些算法时的常用技术(神经网络就是其中之一)。
TA贡献1864条经验 获得超2个赞
如果您以仅利用网络结构但重新训练整个网络(可能从杠杆权重开始)的方式使用迁移学习,您可以选择设置自己的预处理策略。这意味着您可以按 255.0 进行扩展,或者使用 preprocess_input 甚至预处理的自定义实现。
如果您正在使用迁移学习,而不是重新训练整个网络,而是用几个完全连接的密集层替换最后一层,那么强烈建议使用与您正在训练的网络相关联的 preprocess_input。这是因为与您未训练的层相关的权重习惯于特定的预处理步骤。例如,如果您查看InceptionResNetV2 的preprocess_input并遵循 _preprocess_numpy_input 的代码路径,它不会在每种情况下对图像进行标准化,仅当模式为“tf”或“pytorch”时。因此,如果您训练了 InceptionResNetV2 并通过将图像归一化了 0,它可能不会按照您预期的方式训练分类器。
添加回答
举报