归一化为 [0,1] 与 [-1,1]

Posted

技术标签:

【中文标题】归一化为 [0,1] 与 [-1,1]【英文标题】:Normalizing to [0,1] vs [-1,1] 【发布时间】:2018-03-17 19:06:21 【问题描述】:

我已经阅读了一些关于使用神经网络进行关键点检测的教程。我注意到对于输入(图像),除以 255 是很常见的(归一化为 [0,1],因为值介于 0 和 255 之间)。但是对于目标(X/Y)坐标,我注意到标准化为 [-1,1] 更为常见。造成这种差异的任何原因。

示例:http://danielnouri.org/notes/2014/12/17/using-convolutional-neural-nets-to-detect-facial-keypoints-tutorial/

X = np.vstack(df['Image'].values) / 255.  # scale pixel values to [0, 1]
y = (y - 48) / 48  # scale target coordinates to [-1, 1]

【问题讨论】:

这个问题应该在stats.stackexchange.com问,真的和tensorflow或者keras的功能没有任何关系 确实,与机器学习和深度学习技术无关的问题最好在 Cross Validated 或 Data Science SE 上提出,这些领域的专家都在那儿。 【参考方案1】:

据我说,从技术上讲,您如何规范化值应该没有太大区别。

但这些事情在 ML 技术中很重要。

将像素范围从 (0 到 255 ) 归一化到 (0 到 1) 使得收敛速度更快。在这里,您也可以在 -1 和 1 之间进行取值。我在很多问题中都使用了这个范围。而且不存在这样的问题。

但是对于输出来说有点棘手。由于您使用的激活函数,使用范围 0 到 1 并不是一个更好的主意。 ReLU 是 max(0, x),当您提供负值时效果更好。这就是relu的全部意义所在。 tanh 的值范围也在 -1 和 1 之间。剩下的唯一选择是使用 sigmoid 函数,它与 relu 和 tanh 函数相比表现不佳。 sigmoid 的问题是梯度消失,它不是以零为中心的,这会为权重提供一些锯齿形的梯度更新。可以找here.

【讨论】:

【参考方案2】:

我认为神经网络中最常见的图像归一化一般是去除图像的均值并除以其标准差

X = (X - mean_dataset) / std_dataset

我觉得关键点检测问题应该不会差太多。

看看性能上的差异可能会很有趣。我的猜测是,与 [0,1] 归一化相比,去除均值并除以 std ([-1,1]) 会更快地收敛。

因为模型中的偏差会更小,因此如果它们被初始化为 0,则需要更少的时间来达到。

【讨论】:

以上是关于归一化为 [0,1] 与 [-1,1]的主要内容,如果未能解决你的问题,请参考以下文章

OpenCv 011---像素归一化

动态归一化二维 numpy 数组

matlab中直方图归一化问题

sklearn数据预处理:归一化标准化正则化

Python 数据归一化/标准化

在在线机器学习算法中将样本归一化为 0 均值和 1 方差