TensorFlow 2.x使用BatchNorm时评估准确率远低于训练准确率问题咨询
问题根因及解决方案
核心原因:BatchNorm滑动平均参数未收敛
你当前仅设置了3个训练轮次,BatchNorm层默认使用动量0.99更新全局统计值moving_mean和moving_variance,训练轮次不足会导致这两个推理阶段用到的参数完全没有拟合训练集的全局分布,自然会出现训练时准确率极高、推理时准确率骤降的问题,不属于TensorFlow版本bug。
可直接落地的解决方法
- 调整BatchNorm动量参数,加快统计值更新速度,适配少轮次训练场景:
将所有BatchNormalization层的初始化代码修改为layers.BatchNormalization(momentum=0.9),如果还是有问题可进一步调低到0.8 - 增加训练轮次至10轮以上,让滑动平均参数有足够的迭代次数拟合训练集分布
- 修正自定义模型call方法的参数默认值:
你当前的call方法没有给training参数设置默认值,可能导致Keras在evaluate/predict时没有正确传入training=False,修改如下:def call(self, inputs, training=False): - 若调整后仍有问题,可在评估时手动指定training参数:
train_results = model.evaluate(train_dataset, batch_size = BATCH_SIZE, training=False)
补充验证方法
你可以在训练结束后打印BatchNorm层的参数,对比moving_mean、moving_variance和训练集实际的均值、方差,如果差异过大就说明是统计值累计不足的问题。
内容的提问来源于stack exchange,提问作者Luis Leal
相关产品推荐
相关产品推荐

