加入BN层后预测与训练时准确率差距很大解决方案,is_traing参数(ResNet,GoogLeNet,Inception)

环境:tensorflow 1.13.1  python 3.7.3

问题描述:网络中有BN层,训练时设置is_traing=True,验证时设置为False,发现验证或者测试时准确率差距很大。且发现batch-size对其影响严重,就是说如果batch-size=1进行预测时分类结果全部为一类,但是batch-size>=2时,准确率大概70%(训练结果准确率为98%)。一个batch内的不同数据会相互影响,两个相近数据得到的分类结果偏差更大。

问题分析:找了很久,网络上很多说训练Is_traing=True,验证时为False,都是这样设置的。甚至有人说训练验证都设置为True。究其原因,是因为BN层参数未保存!!!

问题解决:存储saver时手动存储变量

在训练或者测试时,saver的初始化如下:

var_list = tf.trainable_variables()
g_list = tf.global_variables()
bn_moving_vars = [g for g in g_list if 'moving_mean' in g.name]
bn_moving_vars += [g for g in g_list if 'moving_variance' in g.name]
var_list += bn_moving_vars
saver = tf.train.Saver(var_list=var_list, max_to_keep=5)

PS:这之前更基础的是定义完整的BN层,比如这些,最后还是发现问题尝试下以上解法:

加入BN层后预测与训练时准确率差距很大解决方案,is_traing参数(ResNet,GoogLeNet,Inception)_第1张图片

你可能感兴趣的:(#,视觉相关网络)