是否通过除以255火车和测试集之间的泄漏信息来对图像进行归一化?

时间:2019-04-26 01:41:31

标签: image keras neural-network conv-neural-network

在在线CNN教程中,我已经看到除以255的次数被多次标准化,这是在训练测试拆分之前对整个数据集进行的。

我的印象是,应根据训练集的均值/标准差/最大最小值等对测试集进行标准化。通过在整个数据集上使用/ 255,显然我们使训练集具有测试集的感觉。是真的吗?

这里正确的方法是什么?

此:

x_train = (x_train - x_train_mean)/x_train_std
x_test = (x_test - x_test_mean)/x_test_std

或者这个:

x_train = (x_train - x_train_mean)/x_train_std
x_test = (x_test - x_train_mean)/x_train_std

或者这个:

data/255

谢谢

有人要求我提供我尝试过的背景知识:这似乎不可置信,我还没有找到关于它的任何讨论。

edit:另一个想法。

因为训练集和测试集已经处于相同的比例(即,每个像素从0-255),所以我认为除以255并没有区别,现在它们处于相同的比例,但是从0开始-1。

2 个答案:

答案 0 :(得分:2)

您的猜测是正确的,将图像除以255只会将图像从0-255重新缩放为0-1。 (将其转换为从int浮点数也使计算方便)。但是,两者都不是必需的。但是,将数据以零为中心时,平均值不会泄漏到测试集中:(http://cs231n.github.io/neural-networks-2/#datapre

x_train =(x_train-x_train_mean)

x_test =(x_test-x_train_mean)

此外,您可以使用sklearn的Pipeline类(https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html)并使用fit()和/或fit_transform()方法来简化此过程。如果您使用Keras,则可以使用包装器

答案 1 :(得分:0)

我只是推测一下。

灰度图像中的像素值在[0,255]中。但是,许多图像可能在很窄的范围内。例如,图像可以是[100-150]。

255.0缩放此图像时,您的范围约为[0.4-0.6]。但是,当您执行(im - mean(im))/std(im)时,此范围将会很好地扩展。

我在python上测试了一些非常简单的东西。

def get_zero_mean_std(a):
    a = (a - np.mean(a))/np.std(a)
    print(a)

get_zero_mean_std(np.array([3,2,1, 6]))

[0. -0.535 -1.069 1.604]

get_zero_mean_std(np.array([3,2,1, 15]))

[-0.397 -0.573 -0.749 1.719]

get_zero_mean_std(np.array([3,2,1,3,1,2,1,1,2]))

[1.556 0.283 -0.99 1.556 -0.99 0.283 -0.99 -0.99 0.283]

如您所见,它将值放在一个合适的范围内。

如果我用255.或最大值归一化,则第二个数组的前3个值将在非常窄的范围内,而最后一个值将在较高范围内。

长话短说,一个原因可能是(im - mean(im))/std(im)比常规除法更好的归一化方法。