批处理标准化是否适用于平衡数据集?

问题描述:

我在每个卷积层中用批量归一化训练了一个使用张量流的分类网络。当我在平衡测试集上预测其中包含的每个类别时,其准确性都是正常的。 但是,如果我从测试集中选择任何一个特定类别,则准确度很低,甚至为零。 但是,当测试集中包含3个类别时,准确度变得更高。众所周知,模型完成训练后权重是固定的。但是我发现测试集中的平衡对预测精度有很大影响。 我认为如果批量标准化对此有影响,所以我删除所有批量标准化并再次重新训练模型。这一次,当我预测只有一个类别的图片,这是正常的。 谁能知道为什么?谢谢!批处理标准化是否适用于平衡数据集?

你说得对。如果你的训练集是不平衡的,你计算并积累平均值(对于每一层)偏向于大多数类。事实上,你并不是“正常化”,而是让不平衡问题变得更糟。 当您拥有均衡的训练集时,可以使用批处理标准化,并且可以确保批次包含平衡数量的样本。这给你最佳的结果。

不过,既然你在评论中补充说,你正在使用tf.contrib.layers.conv2d(x, num_output, kernel_size, stride, padding, activation_fn, normal_fn=tf.contrib.layers.batch_norm)

我发现了问题:normalizer_fn打电话给你传递函数(batch_norm)。但它使用默认参数。默认情况下,is_training等于True因此,即使在测试阶段,您也可以计算批次的均值和方差。请仔细阅读tf.contrib.layers.conv2d的文档,并使用normalizer_params在培训时通过is_training=True,在测试/验证时通过is_training=False

+0

感谢!呃......实际上我在平衡的数据集上训练了模型,每一个小批量也是平衡的。但是,当我对不平衡测试集进行评估时,例如,测试集中只有一个类,其准确度非常低。当我删除批量标准化时,该现象消失。那么如何在只有一个类的测试集上获得正常的性能,而不需要移除BN呢? –

+0

这没有任何意义。你确定你正在使用计算(在列车阶段)的意思和差异,而不是在当前评估批次上计算它们吗? – nessuno

+0

我使用'''tf.contrib.layers.conv2d(x,num_output,kernel_size,stride,padding,activation_fn,normal_fn = tf.contrib.layers.batch_norm)'''当我评估时,我恢复检查点并设置'''重用=假'''。我认为BN在训练过程中计算的均值和方差在评估过程中也是固定的。 –