2016-09-06 3 views
1

列車セット(is_training=True)と検証セット(is_training=False)の両方で特定のモデルを実行する場合は、具体的にどのようにdropoutが適用されているかを確認します。現在、prebuilt modelsは、ネットワークを構築するときにdropoutレイヤに渡されるパラメータis_trainingを公開します。問題は、私がis_trainingという異なる値でメソッドを2回呼び出すと、私は共有ウェイトを持たない2つの異なるネットワークを取得することです(私は思っていますか?)。 2つのネットワークが同じ重みを共有するようにして、検証セットで訓練したネットワークを実行できるようにするにはどうすればよいですか?is_trainingがtrueおよびfalseのTensorflow(tf-slim)モデル

+0

私は、デフォルトの動作では、2例の間の重みを共有することだと思うので、あなたは何の関係もありません。 'tf-slim'は、呼び出し間の変数を再利用する' tf.get_variable() 'を使います。 –

+0

さて、これは主に動作すると思います。 'scope'がセットされていることを確認する必要があります。安全のために' reuse = True'を設定するのが最も良いようです。 –

答えて

1

私は列車とテストモードでOverfeatを使用するためにあなたのコメントを使って解決策を書いた。 (それが動作するかどうかをチェックすることができますので、私はそれをテストすることができませんでした?)

は、まず、いくつかの輸入やパラメータ:鉄道モードで

import tensorflow as tf 
slim = tf.contrib.slim 
overfeat = tf.contrib.slim.nets.overfeat 

batch_size = 32 
inputs = tf.placeholder(tf.float32, [batch_size, 231, 231, 3]) 
dropout_keep_prob = 0.5 
num_classes = 1000 

、我々は正常な範囲を渡します機能overfeat

scope = 'overfeat' 
is_training = True 

output = overfeat.overfeat(inputs, num_classes, is_training,   
          dropout_keep_prob, scope=scope) 

テストモードでは、同じスコープを作成しますが、reuse=Trueで作成します。

scope = tf.VariableScope(reuse=True, name='overfeat') 
is_training = False 

output = overfeat.overfeat(inputs, num_classes, is_training,   
          dropout_keep_prob, scope=scope) 
0

あなただけis_trainingのためのプレースホルダを使用することができます:それは場合によって異なり

isTraining = tf.placeholder(tf.bool) 

# create nn 
net = ... 
net = slim.dropout(net, 
        keep_prob=0.5, 
        is_training=isTraining) 
net = ... 

# training 
sess.run([net], feed_dict={isTraining: True}) 

# testing 
sess.run([net], feed_dict={isTraining: False}) 
+1

私はこれを試して、変数が再利用されていないので問題に遭遇しました。私も説明できなかった記憶制限に遭遇しました。 –

0

が、解決策が異なっています。

私の最初の選択肢は、評価を行うために別のプロセスを使用することです。

checkpoint = tf.train.latest_checkpoint(self.checkpoints_path) 
# wait until a new check point is available 
while self.lastest_checkpoint == checkpoint: 
    time.sleep(30) # sleep 30 seconds waiting for a new checkpoint 
    checkpoint = tf.train.latest_checkpoint(self.checkpoints_path) 
logging.info('Restoring model from {}'.format(checkpoint)) 
self.saver.restore(session, checkpoint) 
self.lastest_checkpoint = checkpoint 

二番目のオプションあなたはグラフをアンロードし、新しい評価グラフを作成し、すべてのエポックの後にある:あなただけの新しいチェックポイントがあることを確認し、(is_training=False付き)評価ネットワークに重みがあることをロードする必要があります。このソリューションは、グラフのロードとアンロードに多くの時間を費やします。

3番目のオプションは、ウェイトを共有することです。しかし、これらのネットワークにキューやデータセットを渡すと問題が発生する可能性があるため、非常に注意する必要があります。私はシャムのネットワークにのみこれを使用します。

with tf.variable_scope('the_scope') as scope: 
    your_model(is_training=True) 
    scope.reuse_variables() 
    your_model(is_training=False) 
関連する問題