某位学者提问:
关于如何规范化图像有一些变化,但大多数似乎都使用以下两种方法:
减去在所有图像上计算的每个通道的平均值(例如VGG_ILSVRC_16_layers)
减去所有图像(例如CNN_S计算的像素/通道,另请参阅Caffe 的参考网络)
在我看来,自然的方法将是规范化每个图像。在光天化日之下拍摄的图像比夜间图像会导致更多的神经元放电,虽然它可以告诉我们我们通常关心边缘等中存在的更有趣的特征的时间。
Pierre Sermanet在 3.3.3 中提到了基于每个图像的局部对比度归一化,但我在我看到的任何示例/教程中都没有遇到过这种情况。我也看过一个有趣的Quora问题和魏秀申的帖子,但他们似乎不支持上述两种方法。
我到底错过了什么?这是一个颜色规范化问题,还是有一篇论文实际上解释了为什么这么多人使用这种方法?
某位学者的回答:
减去数据集平均值用于“居中”数据。此外,理想情况下,如果要将每个特征值归一化为 z 分数,则还希望除以该特征或像素的 sttdev。
我们做这两件事的原因是,在训练网络的过程中,我们将乘以(权重)并增加(偏差)这些初始输入,以便引起激活,然后我们用梯度反向传播来训练模型。
我们希望在这个过程中每个特征都有一个相似的范围,这样我们的梯度就不会失控(并且我们只需要一个全局学习率乘数)。
另一种可以考虑的方式是深度学习网络传统上共享许多参数 - 如果您没有以导致相似范围的特征值的方式扩展输入(即:通过减去平均值在整个数据集上),共享将不容易发生,因为图像的一部分权重很大,而另一部分则太小了。w
您将在一些CNN模型中看到使用每图像的白化,这更符合您的思维方式。
谢谢你的回答。我熟悉将数据居中并确保范围相似以获得稳定梯度的概念。问题更多的是为什么我们需要在整个数据集上这样做,以及为什么与每图像白化相比,这会有所帮助?我想要一个简单的参考,以某种方式表明这在我接受答案之前可以改善学习。我知道批量规范化是一种非常强大的技术,但我看不到与整个数据集规范化的联系。
–
马克斯·戈登
6月 28, 2016 在 18:50
4
他们是。您可以根据需要进行更新 - 分析含义是相同的,这就是梯度下降的美好和可扩展之处。我们使用随机梯度下降(随机输入顺序 + 批处理)的原因是为了平滑我们在梯度空间中的爬山。给定一个点,我们不能真正确定我们的更新是否会将我们推向局部最大值的方向,但是如果你选择足够的点,这种可能性会变得更高(在预期中)。
–
洛勒考斯特
6月 29, 2016 在 17:41
5
这如何帮助将功能纳入类似范围?如果我有两个图像,一个范围从 0 到 255,另一个像素值范围从 0 到 50,比如平均值为 50,stdev 为 15。归一化为我提供了图像 1,范围从 -3.3 到 13.6,图像 2 的范围从 -3.3 到 0。它们的规模仍然不同。
–
丹尼尔
11月 17, 2018 在 14:48
1
@Daniel,并非归一化后的每个图像都将“在同一范围内”,但作为一个组,归一化特征的值将“在同一范围内”。请参阅:en.wikipedia.org/wiki/Standard_score
–
洛勒考斯特
4月 13, 2020 在 22:07
1
@MaxGordon原因很简单,如果不使用图像/ 255对特征进行归一化,梯度就会太大。我不知道更多,但这可能会有所帮助。
–
明斯基
15月 2021, 11 在 26:<>
在批量归一化之前,每个通道的均值减法用于将数据集中在每个通道的零均值周围(R、G、B)。这通常有助于网络更快地学习,因为梯度对每个通道的作用是均匀的。我怀疑如果您使用批量归一化,则每通道均值减法预处理步骤并不是真正必要的,因为无论如何您都在按小批量进行归一化。
“我怀疑如果你使用批量归一化,每通道均值减法预处理步骤并不是真正必要的,因为无论如何你都是按小批量归一化。”但是批量规范是指规范化网络各层中的权重…不是实际的输入图像。这是两件不同的事情。
–
莫妮卡·赫德内克
2月 6, 2019 在 20:54
2
@MonicaHeddneck 我不相信这是真的。批量归一化,以及一般的归一化,通常是指归一化输出(或输入,如果这样想的话)进出网络 - 而不是网络的权重。
–
丹·尼森鲍姆
7月 18, 2020 在 10:17
3
@DanNissenbaum - 在“白皮书世界”之外,批次规范有两种定义。但是,我认为使用这种技术的论文将其用作“层之间的规范化”:请参阅:“批量规范化:通过减少内部协变量偏移来加速深度网络训练”arxiv.org/abs/1502.03167
–
明道加斯·贝尔纳塔维丘斯
每图像规范化很常见,甚至是目前 Tensorflow 中唯一的内置函数(主要是因为它非常容易实现)。它用于您提到的确切原因(同一图像的白天与黑夜)。但是,如果您想象一个更理想的场景,即控制照明,那么每个图像之间的相对差异在算法中将具有重要价值,我们不希望通过每图像归一化来消除这一点(并且希望在整个训练数据集的上下文中进行归一化)。
本主题有两个方面:
规范化以将所有数据保持在相同的比例中 - >在每个图像或整个图像数据集上规范化时,结果将是相似的
相关信息的保存 -->这是在每个图像或每个集合的基础上进行规范化会产生很大差异的地方
例如,如果你想学习CNN来识别夜景和白天场景,并且你基于每个图像进行归一化,那么网络将惨败,因为所有图像都将平等地缩放。
每图像归一化的另一个陷阱是,您可能会人为地获得图像传感器的散粒噪声(例如,对于非常黑暗的场景),这将使CNN将此类噪声混淆为有用的信息。
关于规范化的最后一句警告:如果操作不正确,可能会导致无法恢复的信息丢失,例如图像剪切(生成低于图像数据类型有效范围的值)或饱和度(高于有效范围)。当使用 uint8 变量来表示图像时,这是一个典型的错误,并且由于规范化/预处理操作,值低于 0 或超过 255。一旦发生这种情况,图像信息就会丢失并且无法恢复,因此CNN将无法从这些图像像素中学习任何有用的信息。
这称为在使用数据之前对数据进行预处理。你可以用多种方式处理,但有一个条件是你应该使用相同的函数处理每个数据 X_preproc = f(X),并且这个 f(.) 不应该依赖于数据本身,所以如果你使用当前图像均值来处理这个当前图像,那么你的 f(X) 实际上真的是 f(X, 图像),你不想要那个。
您所说的图像对比度归一化是出于不同的目的。图像对比度归一化将有助于功能。
但是上面的f(.)将通过保持所有特征在数值上彼此相等(当然是近似的)来帮助优化