TensorFlow ——slim.batch_norm大坑(参数设置以及保存问题)
- slim.batch_norm运用方法。
batch_norm_params = {
'is_training': is_training,
'scale': True, # 默认是没有gamma的
'decay': 0.995,
'epsilon': 0.001
}
with slim.arg_scope([slim.conv2d],
normalizer_fn=slim.batch_norm,
normalizer_params=batch_norm_params,
reuse=tf.AUTO_REUSE):
print("")
-
bn的中变量打印包括四个
BatchNorm/beta:0 BatchNorm/gamma:0 BatchNorm/moving_mean:0 BatchNorm/moving_variance:0
-
batch_norm里的mean和var是无法自动更新的,只有手动添加来更新。
- 方法一:
使用slim库的create_train_op训练时可以自动添加update_ops,以更新mean和var参数。
update_ops = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.UPDATE_OPS) train_op = slim.learning.create_train_op(total_loss=self.cm_loss,optimizer=optimizer,update_ops=update_ops)
- 方法二:
在参数里设置updates_collections:None,会强制更新,但不推荐
batch_norm_params = { 'is_training': is_training, updates_collections:None, 'decay': 0.995, 'epsilon': 0.001 } with slim.arg_scope([slim.conv2d], normalizer_fn=slim.batch_norm, normalizer_params=batch_norm_params, reuse=tf.AUTO_REUSE): print("")
- 方法三:
使用普通训练方式,需要使用tf.control_dependencies添加参数。
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) with tf.control_dependencies(update_ops): train_op = optimizer.minimize(loss)
- 方法一:
-
slim.batch_norm保存参数
slim.batch_norm中的moving_mean和moving_variance不是trainable的,在tf.trainable_variables()里面是查不到的,但使用默认的saver = tf.train.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)