2017-05-21 10 views
2

深層ニューラルネットワークでテンソルフローの正規化を正常に使用しています。私はそれを次のようにしています:Tensorflowバッチ正規化はどのように機能しますか?

そして、トレーニングとテストのフェーズの両方でうまく動作します。 しかし、別のプロジェクトで計算されたニューラルネットワークパラメータを使用しようとすると問題が発生します。ここでは、すべての行列乗算と自分で処理する必要があります。ページhttps://www.tensorflow.org/versions/r1.2/api_docs/python/tf/nn/batch_normalizationの式によると

feed_dict = { 
    self.tf_x: np.array([range(self.x_cnt)])/100, 
    self.keep_prob: 1, 
    self.phase_train: False 
} 

for i in range(len(self.z)): 
    # print 0 layer's 1 value of arrays 
    print(self.sess.run([ 
     self.z_prebn[i][0][1], # before bn 
     self.bn[i][0][1],  # mean 
     self.bn[i][1][1],  # var 
     self.bn[i][2][1],  # offset 
     self.bn[i][3][1],  # scale 
     self.z[i][0][1],  # after bn 
    ], feed_dict=feed_dict)) 
    # prints 
    # [-0.077417567, -0.089603029, 0.000436493, -0.016652612, 1.0055743, 0.30664611] 

:問題は、私はtf.nn.batch_normalization機能の動作を再現することができないということです、

bn = scale * (x - mean)/(sqrt(var) + 1e-3) + offset 

しかし、我々が見ることができるよう

1.0055743 * (-0.077417567 - -0.089603029)/(0.000436493^0.5 + 1e-3) + -0.016652612 
= 0.543057 

値は0.30664611と異なり、Tensorflow自体によって計算されます。 ここで私は何が間違っているのですか、バッチ正規化値を自分で計算できないのはなぜですか?

ありがとうございます!

答えて

2

使用される式は若干異なっている。

bn = scale * (x - mean)/(sqrt(var) + 1e-3) + offset 

それshould bevariance_epsilon変数はない平方根であるsigmaと、varianceでスケーリングすることになっている

bn = scale * (x - mean)/(sqrt(var + 1e-3)) + offset 

分散の補正後

、式は正しい値が得られます。

1.0055743 * (-0.077417567 - -0.089603029)/((0.000436493 + 1e-3)**0.5) + -0.016652612 
# 0.30664642276945747 
+0

はありがとうございました!これらは文書でうまくカバーされていません。 – asmisha

関連する問題