测试期间的批量标准化

Posted

技术标签:

【中文标题】测试期间的批量标准化【英文标题】:Batch normalization during testing 【发布时间】:2018-01-11 20:00:52 【问题描述】:

对于测试期间的批量归一化,如何计算每个激活输入(在每一层和输入维度中)的均值和方差?是记录训练的均值和方差,计算整个训练集的均值和方差,还是计算整个测试集的均值和方差?

很多人说你必须预先计算均值和方差,但是如果你使用计算整个测试集的均值和方差的方法,那么你不需要计算整个测试集的均值和方差吗?执行前向传播(不是“pre”)?

非常感谢您的帮助!

【问题讨论】:

这个问题似乎与编程无关 【参考方案1】:

当您在测试中进行预测时,您总是使用训练的统计数据 - 无论是简单的转换还是批量标准化。

我建议您尝试 cs231n 课程以了解更多信息。以下是我在执行此代码时编写批处理规范化的方法:github link。

如果测试统计数据与训练有显着差异,这意味着测试总体上是不同的,模型将无法正常工作。在这种情况下,无论如何您都需要找到不同的训练数据。但更准确地说 - 当您在以某种方式处理的数据上训练模型时,它不能很好地处理以不同方式处理的数据。

假设只有 1 个测试样本 - i。 e.您想为一位客户或其他任何人做出预测。在这种情况下,您根本无法计算测试统计信息。其次,让我们进行批量标准化。数据被标准化,数值现在显示原始数据与某个平均值有多少标准偏差。因此模型将使用此信息进行训练)。如果您使用测试统计数据对测试数据进行标准化,那么值将显示与不同平均值的偏差。

【讨论】:

酷,非常感谢您的帮助!但我只是想知道,为什么总是使用火车的统计数据?如果训练统计量与测试统计量有很大不同,即测试集上的均值和方差 (xhat = (x - mean) / sqrt(var + eps)) 不接近零均值和单位高斯怎么办因为训练均值!= 测试均值和训练方差!= 测试方差?这不会破坏保持零均值和单位高斯的训练目的吗?非常感谢您所做的一切! 如果测试统计数据与训练有显着差异,这意味着测试通常不同,模型将无法正常工作。在这种情况下,无论如何您都需要找到不同的训练数据。但更准确地说 - 当您在以某种方式处理的数据上训练模型时,它不能很好地处理以不同方式处理的数据。 我明白了,谢谢你的帮助,我真的很感激!我很抱歉所有的问题,但是测试统计和训练统计之间会有一些差异,所以通过使用训练统计,我们以不同的方式处理测试数据,使训练模型在测试数据?谢谢你的一切! 首先,让我们假设只有 1 个测试样本 - i。 e.您想为一位客户或其他任何人做出预测。在这种情况下,您根本无法计算测试统计信息。其次,让我们进行批量标准化。数据被标准化,数值现在显示原始数据与某个平均值有多少标准偏差。因此模型将使用此信息进行训练)。如果您使用测试统计数据对测试数据进行标准化,那么值将显示与不同平均值的偏差。 @user8384788 & AndreyLukyanenko 请编辑问题和答案,cmets 是短暂的。【参考方案2】:

在训练时记录经验均值和方差,例如稍后用于测试集的运行平均值,而不是计算每个测试批次的均值和方差。

【讨论】:

以上是关于测试期间的批量标准化的主要内容,如果未能解决你的问题,请参考以下文章

如何在 keras 中正确使用 U-net 批量标准化?

张量流中的批量标准化 - tf.contrib.layers.batch_norm 在训练中效果很好,但测试/验证结果很差

深度学习之BN(批量标准化)

在 keras 中使用批量标准化进行微调

CentOS7.5安装与初始化配置(做标准化)

如果您使用批量标准化,您是不是需要标准化输入?