2017-11-09 18 views
0

CNNにバッチ正規化を追加しようとしていますが、その方法について多くの投稿を読んでいます。結果として、 Falseに訓練する。テストフェーズでドロップアウトを使用したバッチ正規化を使用する

も、テスト時間にTrueにトレーニングを設定すると、結果はナンではありませんが、私はトレーニング画像にテストする場合、彼らは、トレーニング時間よりも悪化しています。

私は0.9の減衰を使用し、ここで15 000回の反復

に訓練された私のグラフの建物はtf.layers.batch_normalization documentationに推奨されているように依存関係として更新OPSを追加し、SESの

extra_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) 
    with tf.control_dependencies(extra_update_ops): 
    phase_train = tf.placeholder(tf.bool, name='phase_train') 

    ###### Other placeholders and variables declarations ###### 

    # Build a Graph that computes the logits predictions from the inference model. 

    loss, eval_prediction = inference(train_data_node, train_labels_node, batch_size, phase_train, dropout_out_keep_prob) 

    # Build a Graph that trains the model with one batch of examples and updates the model parameters. 

    ###### Should I rather put the dependency here ? ###### 
    train_op = train(loss, global_step) 

    saver = tf.train.Saver(tf.global_variables()) 

    with tf.Session() as sess: 
      init = tf.global_variables_initializer() 
      sess.run(init) 

      # Start the queue runners. 
      coord = tf.train.Coordinator() 
      threads = tf.train.start_queue_runners(sess=sess, coord=coord) 

      for step in range(startstep, startstep + max_steps): 
      feed_dict = fill_feed_dict(train_labels_node, train_data_node, dropout_out_keep_prob, phase_train, batch_size, phase_train_val=True,drop_out_keep_prob_val=1.) 
      _, loss_value = sess.run([train_op, loss], feed_dict=feed_dict) 
を使用して、あります

はこちらbatch_norm関数呼び出し

def batch_norm_layer(inputT, is_training, scope): 
    return tf.layers.batch_normalization(inputT, training=is_training, center=False, reuse=None, momentum=0.9) 

、今ここで私はテストするためのモデルを復元する方法である:

phase_train = tf.placeholder(tf.bool, name='phase_train') 

###### Other placeholder definitions ###### 

loss, logits = inference(test_data_node, test_labels_node, batch_size, phase_train, drop_out_keep_prob) 
pred = tf.argmax(logits, dimension=3) 

saver = tf.train.Saver() 

with tf.Session() as sess: 
    saver.restore(sess, test_ckpt) 

    threads = tf.train.start_queue_runners(sess=sess) 

    feed_dict = fill_feed_dict(test_labels_node, test_data_node, drop_out_keep_prob, phase_train, batch_size=1, phase_train_val=False, drop_out_keep_prob_val=1.) 

    pred_loss, dense_prediction, predicted_image = sess.run([loss, logits, pred], feed_dict=feed_dict) 

ここdense_predictionはナンの配列を与えるため、predicted_imageはすべて0 である私の建設の誤差はありますか?どのように私はそれを修正する/それを診断することができますか?

私は「手作り」のバッチノルムを使用するために多くのチュートリアルを読んだことがありますが、公式のバッチノルムを使用する方法についてはよくガイドされたチュートリアルを見つけることができませんでした明らかですが、それは私のためではありません!

+0

'extra_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)'を呼び出すと、グラフはまだ構築されていないので空のコレクションです。実際にバットン変数を更新することはありません。 。 –

+0

私はtf.Graphで と交換してくださいので、もしOK()as_default(): extra_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)tf.control_dependencies(extra_update_ops)と : は、それが動作するはず? –

+0

いいえ、最初に「推論」を呼び出す必要があります。その関数はグラフの一部を構築します。次に、追加の更新操作を取得し、更新操作の制御opを制御の依存関係として構築します。 –

答えて

0

問題は、私は tf.nn.dropoutドロップアウトの実装とともにバッチ正規を使用していたという事実から来ていた表示されます。

に切り替えると、tf.layers.dropoutが問題を解決しました。

関連する問題