web-dev-qa-db-ja.com

Tensorflowでテストのドロップアウトをオフにする方法は?

私は一般にTensorflowとMLにかなり慣れていないので、(おそらく)些細な質問をおforびします。

私はドロップアウト手法を使用してネットワークの学習率を改善しましたが、うまくいくようです。次に、いくつかのデータでネットワークをテストして、次のように機能するかどうかを確認します。

   def Ask(self, image):
        return self.session.run(self.model, feed_dict = {self.inputPh: image})

明らかに、ドロップアウトがまだ配置されているため、毎回異なる結果が得られます。私が考えることができる1つの解決策は、2つの別々のモデルを作成することです-1つはトレーニング用で、もう1つは後でネットワークを実際に使用するためのものです。

この問題を解決する一般的なアプローチは何ですか?

26
G. Mesch

最も簡単な方法は、 keep_prob を使用してplaceholder_with_defaultパラメーターを変更することです。

prob = tf.placeholder_with_default(1.0, shape=())
layer = tf.nn.dropout(layer, prob)

このようにして、トレーニング時に次のようにパラメーターを設定できます。

sess.run(train_step, feed_dict={prob: 0.5})

そして、評価するときにデフォルト値の1.0が使用されます。

51
nessuno

テンソルフロードロップアウトレイヤーでkeep_probを設定する必要があります。これは、重みを保持する確率です。その変数には0.5〜0.8の値を設定すると思います。ネットワークをテストするときは、keep_probに1を指定するだけです。

次のようなものを定義する必要があります。

keep_prob = tf.placeholder(tf.float32, name='keep_prob')
drop = tf.contrib.rnn.DropoutWrapper(layer1, output_keep_prob=keep_prob)

次に、セッションの値を変更します。

_ = sess.run(cost, feed_dict={'input':training_set, 'output':training_labels, 'keep_prob':0.8}) # During training
_ = sess.run(cost, feed_dict={'input':testing_set, 'output':testing_labels, 'keep_prob':1.}) # During testing
9
robbisg

新しい _tf.estimator API_ を使用すると、トレーニングまたはテストのいずれかに基づいて異なるモデルを返すモデル関数を指定しますが、それでもモデルコードを再利用できます。モデル関数では、次のようなことを行います。

_def model_fn(features, labels, mode):

    training = (mode == tf.estimator.ModeKeys.TRAIN)
    ...
    t = tf.layers.dropout(t, rate=0.25, training=training, name='dropout_1')
    ...
_

mode引数は、estimator.train(...)を呼び出すかestimator.predict(...)を呼び出すかによって自動的に渡されます。

8
Jarno

Estimator APIを使用したくない場合は、この方法でドロップアウトを作成できます。

tf_is_traing_pl = tf.placeholder_with_default(True, shape=())
tf_drop_out = tf.layers.dropout(last_output, rate=0.8, training=tf.is_training_pl)

そのため、評価を行うときは、ドロップアウト率を変更する代わりに、{'tf_is_training': False}をセッションにフィードします。

3
cinqS

Tensorflowの更新では、tf.nn.dropoutの代わりにクラスtf.layer.dropoutを使用する必要があります。

これはis_trainingパラメーターをサポートします。これを使用すると、モデルでkeep_probを一度定義し、feed_dictに依存せずに外部パラメーターを管理できます。これにより、コードのリファクタリングが改善されます。

詳細: https://www.tensorflow.org/api_docs/python/tf/layers/dropout

1
David Bernat

テストするとき、レイヤーの出力に1/drop_probを掛けるべきではありませんか?その場合、テスト段階で追加の乗算ステップを実行する必要があります。

0
Epsilon1024