私は一般にTensorflowとMLにかなり慣れていないので、(おそらく)些細な質問をおforびします。
私はドロップアウト手法を使用してネットワークの学習率を改善しましたが、うまくいくようです。次に、いくつかのデータでネットワークをテストして、次のように機能するかどうかを確認します。
def Ask(self, image):
return self.session.run(self.model, feed_dict = {self.inputPh: image})
明らかに、ドロップアウトがまだ配置されているため、毎回異なる結果が得られます。私が考えることができる1つの解決策は、2つの別々のモデルを作成することです-1つはトレーニング用で、もう1つは後でネットワークを実際に使用するためのものです。
この問題を解決する一般的なアプローチは何ですか?
最も簡単な方法は、 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が使用されます。
テンソルフロードロップアウトレイヤーで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
新しい _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(...)
を呼び出すかによって自動的に渡されます。
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}
をセッションにフィードします。
Tensorflowの更新では、tf.nn.dropoutの代わりにクラスtf.layer.dropoutを使用する必要があります。
これはis_trainingパラメーターをサポートします。これを使用すると、モデルでkeep_probを一度定義し、feed_dictに依存せずに外部パラメーターを管理できます。これにより、コードのリファクタリングが改善されます。
詳細: https://www.tensorflow.org/api_docs/python/tf/layers/dropout
テストするとき、レイヤーの出力に1/drop_probを掛けるべきではありませんか?その場合、テスト段階で追加の乗算ステップを実行する必要があります。