在深度學習中為了提高訓練速度,經常會使用一些正正則化方法,如L2、dropout,后來Sergey Ioffe 等人提出Batch Normalization方法,可以防止數據分布的變化,影響神經網絡需要重新學習分布帶來的影響,會降低學習速率,訓練時間等問題。提出使用batch normalization方法,使輸入數據分布規律保持一致。實驗證明可以提升訓練速度,提高識別精度。下面講解一下在Tensorflow中如何使用Batch Normalization
有關Batch Normalization詳細內容請查看論文:
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
關鍵函數
tf.layers.batch_normalization、tf.contrib.layers.batch_norm
這兩個函數用法一致,以 tf.layers.batch_normalization 為例進行講解
layer1_conv = tf.layers.batch_normalization(layer1_conv,axis=0,training=in_training)
其中 axis 參數表示沿着哪個軸進行正則化,一般而言Tensor是[batch, width_x, width_y, channel],如果是[width_x, width_y, channel,batch]則axis應該設為3
1 在訓練階段
訓練的時候需要注意兩點,(1)輸入參數training=True,(2)計算loss時,要添加以下代碼(即添加
update_ops到最后的train_op中)。這樣才能計算μ和σ的滑動平均(測試時會用到)
update_op = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_op):
train_op = optimizer.minimize(loss)
2 在測試階段
測試時需要注意一點,輸入參數training=False,