应该将输入图像归一化为 -1 到 1 还是 0 到 1

数据挖掘 正常化
2021-09-23 06:34:34

许多 ML 教程在将输入图像输入到 ML 模型之前将其标准化为 -1 到 1 的值。ML 模型很可能是几个 conv 2d 层,然后是一个完全连接的层。假设激活函数是 ReLu。

我的问题是,将图像标准化为 [-1, 1] 范围对负范围内的输入像素是否不公平,因为通过 ReLu,输出将为 0。将图像标准化为 [0, 1] 范围会更好吗?

谢谢你。

4个回答

除了初始化(正如 Djib2011 的精彩回答),许多人工神经网络分析利用或依赖于输入和输出的标准化(例如 SELU 激活)。所以规范化输入是一个好主意。

然而,这通常可以通过归一化层(例如,LayerNorm 或 BatchNorm)来完成,此外,我们可能希望强制像素处于特定的固定范围内(因为真实图像是这样的)。当输出是图像时(例如,对于图像的 VAE),这一点尤其重要。由于我们需要比较输入图像I到输出图像I^,应该很容易强制执行像素值I^进入一个简单的、已知的、困难的范围。使用 sigmoid 产生的值[0,1], 而使用 tanh 在[1,1]. 但是,通常认为 tanh 比 sigmoid 好;例如,

换句话说,对于输出必须与输入匹配的情况,使用 [1,1]可能是更好的选择。此外,虽然没有“标准化”,但范围[1,1] 仍然以零为中心(不像 [0,1]),这对网络来说更容易学习标准化(尽管我怀疑这仅在训练的早期很重要)。

另外,对于这句话

将图像归一化到 [-1, 1] 范围对负范围内的输入像素不公平,因为通过 ReLu,输出将为 0

答案是不”。主要是因为在几乎所有情况下,非线性激活首先发生在其他层之后。通常这些层(例如,完全连接或卷积)有一个偏置项,它可以并且无论如何都会在范围内移动(在发生一些额外的,通常是线性的变换之后)。

然而,低于零的值确实会“消亡”它们对梯度的贡献。同样,这在训练的早期可能尤其如此。这是使用 ReLU 以外的激活函数的一个论据,例如leaky ReLU,这是一个真正的危险。然而,希望这些值应该有不止一种方式在网络中传播。例如,第一个特征图中的多个输出(在第一个卷积层之后,在激活之前)将取决于给定的单个输入,因此即使一些被 ReLU 杀死,其他的也会继续传播该值。这被认为是 ResNet 如此有效的原因之一:即使值在 ReLU 中消失,仍然有跳过连接供它们传播。

尽管如此,根据整个数据集的统计数据对图像进行归一化可能仍然更为常见。每个图像归一化的一个问题是具有非常小的像素值范围的图像将在范围内“扩展”(例如,带有微小云的全蓝天将极大地突出该云)。然而,在某些情况下,其他人可能会认为这是一种好处(例如,它可能会自动消除亮度差异)。

最终,最佳方法有待商榷,可能取决于问题、数据和模型。有关更多信息,请参见例如 [1][2][3][4][5][6][7]

正如之前的其他答案所说,实际上,您选择两者中的哪一个没有太大区别。但是,理论上最好将输入扩展到[1,1][0,1]我认为最好标准化您的输入(即μ=0,σ=1)。

让我解释一下原因:

深度神经网络,尤其是在早期,在反向传播方面遇到了很多麻烦,因为它们遭受了梯度消失/爆炸的困扰。解决这个问题的一种流行方法是以更智能的方式初始化网络的权重。两种初始化技术已被证明是最流行的:Glorot 初始化(有时称为 Xavier 初始化)和He 初始化,它们都是相同思想的变体。

为了推导出它们的初始化,他们做了一些假设,其中之一是输入特征的均值为零。您可以阅读这篇文章以获得简化的解释,但我建议阅读上面提到的两篇论文。

如果我们考虑归一化 0 到 1 会更好,有两个原因。

  1. 如果我们检查训练数据,如果有像素,那么它将是某个值,而空值将是 0,希望我们看不到任何 -1。
  2. 如果我们使用激活函数“rectified linear unit(relu)”,它将转换神经元的输出总是大于 0,而不是负值。如果您使用其他激活函数,如“tanh”或“sigmod”,那么可能会有负值。

为了获得更好的结果,明智地使用激活函数。

我觉得没多大关系。

首先是因为网络不知道输入是像素值,它不能是负数。

其次,即使 relu 会削减负值,网络也会调整其权重以弥补这一点。