图像分类预处理中为何逐样本将像素缩放至-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




