1

私は最近Tensorflowを選び、環境に適応するよう最善を尽くしてきました。素晴らしいことは何もありませんでした!しかし、tf.contrib.layers.batch_normを使ったバッチの正規化は少し難解でした。 は今、ここに私が使用している機能である:Tensorflowバッチ正規化:tf.contrib.layers.batch_norm

def batch_norm(x, phase): 
    return tf.contrib.layers.batch_norm(x,center = True, scale = True, 
        is_training = phase, updates_collections = None) 

がこれを使用して、私は私がオンライン見つけたほとんどのドキュメント(また、Q & A)に続き、それは次のような結論に私を導いた:

1)is_trainingはトレーニングではTrue、テストではfalseに設定する必要があります。意味あり!トレーニングの際、私は収束しました(エラー< 1%、Cifar 10 Dataset)。

しかし、テスト中、上記のバッチノルム関数の引数として(update collection = None)を追加しない限り、私の結果はひどいです(エラー> 90%)。それを引数としてテストするだけで、私が期待していたエラーが出ます。

私はまた、訓練のために、以下を使用してください午前:

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) 
with tf.control_dependencies(update_ops):          # Ensures, Updating ops will perform before training 
    with tf.name_scope('Cross_Entropy'): 
     cross_entropy = tf.reduce_mean(          # Implement Cross_Entropy to compute the softmax activation 
      tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv)) # Cross Entropy: True Output Labels (y_), Softmax output (y_conv) 
     tf.summary.scalar('cross_entropy', cross_entropy)      # Graphical output Cross Entropy 

    with tf.name_scope('train'): 
     train_step = tf.train.AdamOptimizer(1e-2).minimize(cross_entropy)  # Train Network, Tensorflow minimizes cross_entropy via ADAM Optimization 

    with tf.name_scope('Train_Results'): 
     with tf.name_scope('Correct_Prediction'): 
      correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1)) # Check if prediction is wrong with tf.equal(CNN_result,True_result) 
     with tf.name_scope('Accuracy'): 
      accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  # Find the percent accuracy, take mean of correct_prediction outputs 
      tf.summary.scalar('accuracy', accuracy)        # Graphical output Classification Accuracy 

これは、バッチの正規化パラメータがトレーニング中に更新していることを確認してください。

これは、更新コレクション= Noneはバッチ正規化関数の素晴らしいデフォルトであることがわかります。テスト中に関数はバッチ正規化パラメータを調整しないようにします。

最後に、テストフェーズ中に、バッチ正規化がオンになっていて、オフになっているときに、良い結果(Expected Error)があるのは正常ですか?上記のバッチノルム関数を使用して、私はうまく訓練することができました(is_training = True)とよくテストします(is_training = False)。しかし、テスト中(is_training = True)、私はまだ素晴らしい結果を得ることができました。これはちょうど私に悪い気持ちを与えます。誰かがなぜこれが起こっているのか説明できますか?それとも、それはまったく起こっているはずですか?

ありがとうございました!

答えて

0

不安定decay移動平均のレート(デフォルトは0.999)は、合理的に良いトレーニングのパフォーマンスが得られますが、検証/テストのパフォーマンスが低い場合があります。少し低いdecayレート(0.99または0.9)を試してください。また、安定性を改善するためにzero_debias_moving_mean=Trueを試してください。

異なるバッチサイズを試して、検証のパフォーマンスが向上するかどうかを確認することもできます。バッチサイズが大きいと、バッチ標準化が使用されているときに検証のパフォーマンスが低下することがあります。 thisを参照してください。

+0

ありがとうございました!しかし、私は小さなバッチサイズ(100)を使用しており、それを他のいくつかの範囲に変更しました。私は、GPUのメモリ制限のために特に大きいバッチを使用していません。 – Charles

+0

私は、減衰率を変更し、あなたのように安定性を改善することを検討します。 – Charles

0

位相変数、テンソルフローブール値またはPythonブール値ですか。

+0

私の段階はテンソルフローブールです。 – Charles

関連する問題