meg*_*ger 6 normalization computer-vision neural-network keras tensorflow
我一直在学习一些使用神经网络进行关键点检测的教程。我注意到,对于输入(图像),除以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]
Run Code Online (Sandbox Code Playgroud)
根据我的说法,从技术上讲,如何标准化这些值应该没有太大差异。
但这些事情在机器学习技术中很重要。
将像素范围从 (0 到 255 ) 归一化为 (0 到 1) 可以使收敛速度更快。在这里您也可以在 -1 和 1 之间进行设置。我在很多问题中都使用了这个范围。并且不存在这样的问题。
但对于输出来说,这有点棘手。由于您正在使用的激活函数,使用范围 0 到 1 并不是一个更好的主意。ReLU 是 max(0, x),当您提供负值时效果更好。这就是 relu 的全部意义所在。tanh 的值范围也介于 -1 和 1 之间。您唯一的选择是使用 sigmoid 函数,与 relu 和 tanh 函数相比,它的性能不太好。sigmoid 的问题是梯度消失,并且它不是以零为中心的,这为权重提供了一些锯齿状的梯度更新。您可以在这里查找。
我认为神经网络的图像归一化最常见的方法是删除图像的均值并除以其标准差
X = (X - mean_dataset) / std_dataset
Run Code Online (Sandbox Code Playgroud)
我认为关键点检测问题应该不会有太大差异。
看到性能差异可能会很有趣。我的猜测是,与 [0,1] 标准化相比,删除均值并除以 std ([-1,1]) 会更快地收敛。
因为如果它们初始化为 0,模型中的偏差会更小,因此需要更少的时间来达到。
归档时间: |
|
查看次数: |
6318 次 |
最近记录: |