You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

图像分类预处理中为何逐样本将像素缩放至-1到1区间?

为什么有些模型选择将像素缩放至-1到1区间而非0到1?

咱做CV开发的应该都碰到过,有些模型的预处理会把0-255的像素值转成-1到1,而不是常规的0到1。其实这背后主要有这么几个原因:

  • 匹配激活函数的特性
    不少早期的CNN模型(比如一些用tanh作为激活函数的结构),输出范围本身就是-1到1。如果输入也落在这个区间,能让激活函数的输出更接近线性区,避免出现饱和的情况——毕竟tanh在接近±1的时候梯度会趋近于0,输入在-1到1的话,能让模型在训练时梯度更新更顺畅。

  • 数据分布的对称性优化
    把数据中心化到0周围(-1到1的均值是0),相比0到1的偏移分布,能让模型的权重更新更稳定。举个例子,当输入是对称分布时,权重的正负更新会更均衡,不容易出现偏向某一侧的梯度累积,这对训练深层模型来说挺重要的。

  • 预训练模型的延续性
    像Keras里的InceptionV3、MobileNet这些经典模型,它们在ImageNet上预训练的时候,就是用的-1到1的像素范围。如果后续微调或者直接使用这些模型,必须遵循同样的预处理规则,不然模型的输入分布和训练时不一致,效果会大打折扣——这也是你看到preprocess_input()这么做的核心原因之一。

  • 数值计算的稳定性
    有些框架或者优化器在处理中心对称的数据时,数值稳定性更好。比如在计算批量归一化(BatchNorm)的时候,输入均值为0的话,能减少额外的偏移计算,让归一化的效果更直接。

其实说白了,这就是个“跟着训练数据来”的问题,同时结合了激活函数和优化的需求。0到1的缩放也不是不好,很多模型(比如ResNet的某些实现)也在用,关键是要和模型训练时的预处理保持一致。

内容的提问来源于stack exchange,提问作者surfertas

火山引擎 最新活动