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

时间:2017-06-19 07:51:47

标签: tensorflow

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

1 个答案:

答案 0 :(得分:0)

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

但是,由于您在评论中添加了您正在使用的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