在将数据输入 TensorFlow 模型之前,我遇到了两种标准化方法。 第一种方法是使用 tf.dataset.per_image_standardization()。 该函数单独计算每个图像的平均值和标准差。我在官方的TensorFlow resnet cifar10教程中找到了这种方法。 https://github.com/tensorflow/models/tree/master/official/resnet 在测试阶段,每个图像都单独标准化。
第二种方法是以每个 channel 的方式计算整个数据集的平均值和标准差。我在下面的密集网实现中找到了这种方法。 https://github.com/taki0112/Densenet-Tensorflow 在测试阶段,测试数据集也作为整批进行预处理。
这两种标准化方式并不等同。 我的问题是:对于第二种标准化方法,如何预处理单个图像以进行推理?我们应该使用什么意思和stddev?我们是否需要像批量归一化一样使用为训练数据集计算的平均值和标准偏差?
最佳答案
是的,您应该使用训练阶段计算出的平均值和标准差。
一般来说,有两种标准化方法。假设我们有一个形状为 [B, H, W, C]
X
- 按特征方法分别对图像的每个点进行标准化。为此,必须在训练阶段计算估计每个特征的平均值和标准差的形状
[H, W, C]
的矩阵。 - 每 channel 方法分别对图像的每个 channel 进行标准化。这可以通过 3 种方式完成:
- 计算训练集中每个 channel 的平均值和标准差
- 从大量图像中获取统计信息并在评估阶段使用这些统计信息(例如
imagenet: 'mean': [0.485, 0.456, 0.406], 'std': [0.229, 0.224, 0.225]
) - 动态标准化每个 channel 。计算每个示例(测试阶段)或每个批处理(训练阶段)的平均值和标准差,并分别对每个 channel 进行标准化。
大多数模型都使用“每 channel ”方法,但没有正确的答案。重要的是训练和测试阶段保持一致。另请查看 here 了解更多详细信息。
编辑:出于迁移学习的目的,最好的选择是逐步采用新的数据集统计数据。因此,从旧数据集初始化统计数据,并在整个微调过程中使用新数据集的统计数据更新它们。在训练阶段结束时,平均值和标准差必须已调整到新的数据集。
关于python - 如何在输入深度神经网络模型之前对数据进行标准化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55055866/