2017-02-13 19 views
0

嗨。我对tf很陌生,问题是如何将批量归一化应用于推理。我在训练和测试过程中使用tensorflow进行批量归一化。代码如下,你可以看到,我用不同的mean和var值来对待培训和测试。现在训练已经完成,我想将模型应用于练习。比如使用演示加载ckpt文件并测试一个例子。在这种情况下,我怎样才能使这一个案例正常化?是否有任何方法可以在每次训练和恢复之后保存BN的均值和变量?非常非常感谢你!Tensorflow如何将批规范化应用于推理

fc_mean, fc_var = tf.nn.moments(
      input, 
      axes=[0], 
     ) 
     scale = tf.Variable(tf.ones([out_size])) 
     shift = tf.Variable(tf.zeros([out_size])) 
     epsilon = 0.001 
     ema = tf.train.ExponentialMovingAverage(decay=0.5) 
     def mean_var_with_update(): 
      ema_apply_op = ema.apply([fc_mean, fc_var]) 
      with tf.control_dependencies([ema_apply_op]): 
       return tf.identity(fc_mean), tf.identity(fc_var) 
     mean, var = tf.cond(train_phase, 
          mean_var_with_update, 
          lambda: (ema.average(fc_mean), 
             ema.average(fc_var) 
            ) 
          ) 
     input_BN = tf.nn.batch_normalization(input, mean, var, shift, scale, epsilon) 

回答

0

我不确定,但你们认为这会是对的吗?我保存了在训练期间产生的转移(偏移)和缩放比例。当我需要将模型应用于实践时,我只是使用shift和scale来替换mean和var。并将测试用例的shift和var设置为零。

if not test: 
     input_BN = tf.nn.batch_normalization(input, mean, var, shift, scale, epsilon) 
    else: 
     input_BN = tf.nn.batch_normalization(input, shift, scale, 0, 0, epsilon) 
+0

对不起,我现在有点乱了。在本文中,它通过设置scale = sqrt(var),shift = mean表示,我们可以恢复原始激活。所以在张量流训练过程中,模型收敛后的尺度和位移值会有多大? – syntaxError