描述坑的过程:
resnet50做分类,使用了bn层
在训练的时候用了一个is_train占位符来区分训练和测试(单独区分开的,并不是一起做的)
训练的时候is_train=True,测试的时候is_train=False
现象:训练精度很高,测试精度不忍直视
问题原因:
这个可能是因为没有把bn层里面的训练时统计出的参数保持下来造成的,在保存模型的时候,除了保存weights,bias,还要保存bn中的mean,var等统计参数。测试的时候,is_training=True,用的是当前batch内的统计参数,这个没问题。is_training=False,用的是保存的参数,如果没保存,就直接初始化,这个肯定效果不好.
所以需要把bn层的统计参数在保存的时候也一起存起来.
存模型的时候不能只保存trainable_variables
,因为BN的参数不属于trainable_variables
。为了方便,可以用tf.global_variables()
。使用姿势如下
saver = tf.train.Saver(var_list=tf.global_variables())
savepath = saver.save(sess, 'here_is_your_personal_model_path’)
使用方法:
x_norm = tf.layers.batch_normalization(x, training=training)
# ...
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
train_op = optimizer.minimize(loss)