为了账号安全,请及时绑定邮箱和手机立即绑定

Keras:rescale=1./255 vs preprocessing_function

Keras:rescale=1./255 vs preprocessing_function

SMILET 2021-11-09 17:01:29
背景我发现了很多代码示例,其中人们使用 usingrescale=1./255或正在使用来预处理他们的图像数据,他们将其preprocessing_function设置preprocess_input为他们在 ImageDataGenerator 中使用的相应模型的 。首先,我认为 usingrescale=1./255仅在处理预训练的 vgg16 模型时有效,但我一直看到它与预训练的 resetnet50、inception 等一起使用的示例。虽然 keras-blog ( https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html ) 使用这种方法......ImageDataGenerator(rescale=1./255, ...... Keras 文档 ( https://keras.io/applications/ ) 使用这种方法:from keras.applications.vgg19 import preprocess_inputImageDataGenerator(preprocessing_function=preprocess_input, ...我认为使用我想要训练的相应模型的相应 preprocess_input 总是优于使用 rescale=1./255 方法,因为它将 100% 反映在训练预训练模型期间使用的预处理。题在预处理图像以进行迁移学习时,我需要澄清何时使用我想要训练的各个模型的rescale=1./255vs keras 内置preprocess_input。这是否仅在使用预训练模型(即加载权重与从头开始训练)时有所不同?
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

我有类似的问题,在运行下面的小实验后,我认为您preprocess_input在使用预训练模型时需要始终使用,而在从头开始训练时使用 rescale。

显然,当您直接使用预训练模型进行推理时,您必须使用preprocess_input:例如我尝试resnet50kaggle dog-vs-cats数据集上使用,rescale=1./255它返回索引 111(nematode, nematode worm, roundworm)作为所有图像最可能的类,而使用preprocess_input它主要返回与预期的狗和猫相对应的索引。

然后我试着用resnet50include_top=False,从imagenet,一个冰冻的权重GlobalAveragePooling2D层和一个最终的致密层乙状结肠。我与 Adam 在kaggle dog-vs-cats数据集的2000 张图像上对其进行了训练(并且我使用了 1000 张图像作为验证)。使用重新缩放它在 5 个时期后无法适应任何东西,它总是预测第一类(虽然奇怪的是训练准确度是97%,但是当我运行evaluate_generator`` on the training images, the accuracy is **50%**). But withpreprocess_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 orpreprocess_input` 时,我得到了95% 的验证准确度。

我试着用同样的事情vgg16,与重新调整它并设法适应,但87% VS 97%使用preprocess_input,并且95%没有任何东西。

然后我从头开始用 10 个 epoch 训练了一个小型 conv 网络,没有任何东西或使用resnet50 preprocess_input,它根本不适合,但是通过重新缩放我得到了70% 的验证准确度。


查看完整回答
反对 回复 2021-11-09
?
繁星点点滴滴

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.


这样做的原因是因为您需要规范化您的输入。通常最小-最大归一化的公式是

//img1.sycdn.imooc.com//618a392900013c4917670412.jpg

这相当于做

1./255

由于图像的像素值将在 0 和 1 之间

对输入进行归一化的原因与数值稳定性和收敛性有关(技术上你不需要它,但有了它,神经网络有更高的收敛机会,梯度下降/亚当算法更有可能稳定)

根据Does this only make a difference when using pretrained-models i.e. with loaded weights vs training from scratch?否,它不仅仅与预训练模型相关联,这是在机器学习中使用某些算法时的常用技术(神经网络就是其中之一)。


查看完整回答
反对 回复 2021-11-09
?
慕斯王

TA贡献1864条经验 获得超2个赞

如果您以仅利用网络结构但重新训练整个网络(可能从杠杆权重开始)的方式使用迁移学习,您可以选择设置自己的预处理策略。这意味着您可以按 255.0 进行扩展,或者使用 preprocess_input 甚至预处理的自定义实现。

如果您正在使用迁移学习,而不是重新训练整个网络,而是用几个完全连接的密集层替换最后一层,那么强烈建议使用与您正在训练的网络相关联的 preprocess_input。这是因为与您未训练的层相关的权重习惯于特定的预处理步骤。例如,如果您查看InceptionResNetV2 的preprocess_input并遵循 _preprocess_numpy_input 的代码路径,它不会在每种情况下对图像进行标准化,仅当模式为“tf”或“pytorch”时。因此,如果您训练了 InceptionResNetV2 并通过将图像归一化了 0,它可能不会按照您预期的方式训练分类器。


查看完整回答
反对 回复 2021-11-09
  • 3 回答
  • 0 关注
  • 367 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信