首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras: rescale=1./255 vs preprocessing_function=preprocess_input -使用哪个?

Keras: rescale=1./255 vs preprocessing_function=preprocess_input -使用哪个?
EN

Stack Overflow用户
提问于 2019-02-15 11:12:29
回答 3查看 10.1K关注 0票数 8

背景

我发现了相当多的代码示例,人们要么使用rescale=1./255预处理图像数据,要么使用preprocessing_function将其设置为他们在ImageDataGenerator中使用的相应模型的preprocess_input

虽然keras-blog (https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html)使用这种方法...

代码语言:javascript
复制
ImageDataGenerator(rescale=1./255, ...

..。Keras文档(https://keras.io/applications/)使用这种方法:

代码语言:javascript
复制
from keras.applications.vgg19 import preprocess_input
ImageDataGenerator(preprocessing_function=preprocess_input, ...

我认为使用我想要训练的各个模型的相应preprocess_input总是优于使用rescale=1./255方法,因为它将100%反映在预训练模型的训练过程中使用的预处理。

问题

我需要澄清一下,当我在预处理图像以进行迁移学习时,何时使用rescale=1./255与我想要训练的相应模型的keras内置preprocess_input。这是否只在使用预训练模型时才有所不同,即加载权重与从头开始训练?

EN

回答 3

Stack Overflow用户

发布于 2019-10-09 01:42:01

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

然后我尝试使用resnet50include_top=False,从imagenet冻结权重,一个GlobalAveragePooling2D层和一个最终的密集sigmoid层。我和亚当在kaggle狗对猫数据集的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做了同样的事情,通过重新缩放它确实设法适应了,但是使用preprocess_input87% vs 97%,以及不使用任何东西的95%

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

票数 9
EN

Stack Overflow用户

发布于 2019-02-15 11:19:04

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之间

规范化输入的原因与数值稳定性和收敛性有关(从技术上讲,你不需要它,但有了它,神经网络有更高的收敛机会,梯度下降/adam算法更有可能是稳定的)。

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

如果您有兴趣真正了解这一切背后发生了什么,以及为什么规范化如此重要,我强烈建议您参加Andrew Ng course on machine learning

票数 3
EN

Stack Overflow用户

发布于 2020-05-08 16:28:43

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54702212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档