在馈入深度神经网络nodel之前如何标准化数据

时间:2019-03-08 02:29:09

标签: python tensorflow

在将数据输入TensorFlow模型之前,我已经遇到了两种标准化方法。 第一种方法是使用tf.dataset.per_image_standardization()。 此函数分别为每个图像计算均值和标准差。我在TensorFlow resnet cifar10官方教程中找到了这种方法。 https://github.com/tensorflow/models/tree/master/official/resnet 在测试阶段,每张图片都分别进行了标准化。

第二种方法是以每个通道样式计算整个数据集的均值和标准差。我在以下的密集网络实现中找到了这种方法。https://github.com/taki0112/Densenet-Tensorflow 在测试阶段,还将对测试数据集进行整体处理。

这两种标准化方法不等效。 我的问题是:对于第二种标准化方法,如何对单个图像进行预处理以进行推理?我们应该使用什么意思和stddev?我们是否需要像批量归一化那样使用为训练数据集计算的均值和标准差?

1 个答案:

答案 0 :(得分:1)

是的,您应该使用从训练阶段计算出的均值和标准差。

通常,有两种标准化方法。假设我们有一个X形状的输入[B, H, W, C]

  • 每个功能方法分别对图像的每个点进行标准化。为此,必须在训练阶段计算形状[H, W, C]的矩阵,以估计每个特征的均值和标准差。
  • 每个渠道方法分别对图像的每个渠道进行标准化。这可以通过3种方式完成:
    • 在训练集中计算每个通道的均值和标准差
    • 从大量图像中获取统计数据,并在评估阶段使用它们(例如imagenet: 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225]
    • 动态标准化每个频道。计算每个示例(测试阶段)或每个批次(培训阶段)的均值和标准差,并分别归一化每个通道。

大多数模型使用“每个通道”方法,但是没有正确的答案。重要的是在培训和测试阶段之间保持一致。还要检查here以获得更多详细信息。

edit:出于转移学习的目的,最好的选择是逐渐采用新的数据集统计数据。因此,从旧数据集中初始化统计信息,并在整个过程中进行微调,以新数据集中的统计信息进行更新。在训练阶段结束时,均值和标准差必须已调整为新的数据集。