私は最近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)、私はまだ素晴らしい結果を得ることができました。これはちょうど私に悪い気持ちを与えます。誰かがなぜこれが起こっているのか説明できますか?それとも、それはまったく起こっているはずですか?
ありがとうございました!
ありがとうございました!しかし、私は小さなバッチサイズ(100)を使用しており、それを他のいくつかの範囲に変更しました。私は、GPUのメモリ制限のために特に大きいバッチを使用していません。 – Charles
私は、減衰率を変更し、あなたのように安定性を改善することを検討します。 – Charles