2016-05-02 10 views
18

私のnnの各トレーニングステップの学習率をプリントアウトしたいと思います。tf.train.AdamOptimizerから現在の学習率を取得する

私はアダムが適応学習率を持っていますが、私は(tensorboardで可視化のために)これを見ることができる方法があることを知っている

+2

を、あなたは、TRを得ることができます:adam_op = tf.train.AdamOptimizer(0.1、ベータ1 = 0.5、ベータ2 = 0.5) 、train_op = adam_op.minimize(cost)の後に、sess.run(adam_op._lr_t)を出力します。しかし、それはあなたのコードで動作しているかどうかは分かりません。あなたはうんざりテストできますか? –

+0

サイドノート:アダムについて考える正しい方法は、学習率(グラデーションのスケーリング)ではなく、ステップサイズです。渡す 'learning_rate'は最大ステップサイズ(パラメータあたり)です。アダムはグラデーションの一貫性に応じて、そのサイズまでステップアップします。 – mdaoust

+0

OK @ mdaoustですが、各ステップでどのように学習率を得ることができますか?私はソン・キムの提案を試みたが、平らな線を返すので、うまくいかなかった。ありがとう。 – Escachator

答えて

2

キム、提案は、私のために働いていた私の正確な手順は以下の通りであった。

lr = 0.1 
step_rate = 1000 
decay = 0.95 

global_step = tf.Variable(0, trainable=False) 
increment_global_step = tf.assign(global_step, global_step + 1) 
learning_rate = tf.train.exponential_decay(lr, global_step, step_rate, decay, staircase=True) 

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate, epsilon=0.01) 
trainer = optimizer.minimize(loss_function) 

# Some code here 

print('Learning rate: %f' % (sess.run(trainer ._lr))) 
4

すべてのオプティマイザには、学習率の値を保持するプライベート変数があります。

adagradおよびgradient descent と呼ばれます。 adamではself._lrです。

この値を取得するには、sess.run(optimzer._lr)を印刷するだけで済みます。 Sess.runはテンソルであるために必要です。

2

あなたができる最も簡単なことは、オプティマイザをサブクラス化することだと思います。

これには、可変型に基づいてディスパッチされるいくつかのメソッドがあります。通常密な変数は_apply_denseを通過するようです。このソリューションは、まばらなものやその他のものでは機能しません。

implementationを見ると、これらの「スロット」にmt EMAが格納されていることがわかります。したがって、このような何かにそれを行うようだ:

class MyAdam(tf.train.AdamOptimizer): 
    def _apply_dense(self, grad, var): 
     m = self.get_slot(var, "m") 
     v = self.get_slot(var, "v") 

     m_hat = m/(1-self._beta1_power) 
     v_hat = v/(1-self._beta2_power) 

     step = m_hat/(v_hat**0.5 + self._epsilon_t) 

     # Use a histogram summary to monitor it during training. 
     tf.summary.histogram("hist", step) 

     return super(MyAdam,self)._apply_dense(grad, var) 

stepここでは[-1,1]、そのパラメータに適用される実際のステップを決定するために、学習率を乗じます何の間隔になります。

多くの場合、グラフのノードはありません。なぜなら、すべてを実行する1つの大きなtraining_ops.apply_adamがあるからです。

ここでは、ヒストグラムの概要を作成しています。しかし、あなたはオブジェクトに付いている辞書にそれを貼り付け、後で読むか、それを使って何でもしても構いません。

mnist_deep.pyにそのをDroping、トレーニングループにいくつかの要約を追加:

all_summaries = tf.summary.merge_all() 
file_writer = tf.summary.FileWriter("/tmp/Adam") 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in range(20000): 
     batch = mnist.train.next_batch(50) 
     if i % 100 == 0: 
      train_accuracy,summaries = sess.run(
       [accuracy,all_summaries], 
       feed_dict={x: batch[0], y_: batch[1], 
          keep_prob: 1.0}) 
      file_writer.add_summary(summaries, i) 
      print('step %d, training accuracy %g' % (i, train_accuracy)) 
     train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) 

はTensorBoardで次の図生成します:すぐにコードを読み取ることにより

TensorBoard Histogram tab, showing 8 different histogram plots

+0

リソース制約のため、ネットワークを別のGPUに明示的に配置する必要があります。このサブクラス化ハックでは、「明示的なデバイス仕様を満たすことができません」/デバイス:GPUデバイスのサポートされているカーネルがないためGPU: 。 'tf.summary.histogram'行を削除すると、苦情が取り除かれます。 – ziyuang

関連する問題