私のnnの各トレーニングステップの学習率をプリントアウトしたいと思います。tf.train.AdamOptimizerから現在の学習率を取得する
私はアダムが適応学習率を持っていますが、私は(tensorboardで可視化のために)これを見ることができる方法があることを知っている
私のnnの各トレーニングステップの学習率をプリントアウトしたいと思います。tf.train.AdamOptimizerから現在の学習率を取得する
私はアダムが適応学習率を持っていますが、私は(tensorboardで可視化のために)これを見ることができる方法があることを知っている
キム、提案は、私のために働いていた私の正確な手順は以下の通りであった。
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)))
すべてのオプティマイザには、学習率の値を保持するプライベート変数があります。
adagradおよびgradient descent と呼ばれます。 adamではself._lr
です。
この値を取得するには、sess.run(optimzer._lr)
を印刷するだけで済みます。 Sess.runはテンソルであるために必要です。
あなたができる最も簡単なことは、オプティマイザをサブクラス化することだと思います。
これには、可変型に基づいてディスパッチされるいくつかのメソッドがあります。通常密な変数は_apply_dense
を通過するようです。このソリューションは、まばらなものやその他のものでは機能しません。
implementationを見ると、これらの「スロット」にm
とt
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で次の図生成します:すぐにコードを読み取ることにより
リソース制約のため、ネットワークを別のGPUに明示的に配置する必要があります。このサブクラス化ハックでは、「明示的なデバイス仕様を満たすことができません」/デバイス:GPUデバイスのサポートされているカーネルがないためGPU: 。 'tf.summary.histogram'行を削除すると、苦情が取り除かれます。 – ziyuang
を、あなたは、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)を出力します。しかし、それはあなたのコードで動作しているかどうかは分かりません。あなたはうんざりテストできますか? –
サイドノート:アダムについて考える正しい方法は、学習率(グラデーションのスケーリング)ではなく、ステップサイズです。渡す 'learning_rate'は最大ステップサイズ(パラメータあたり)です。アダムはグラデーションの一貫性に応じて、そのサイズまでステップアップします。 – mdaoust
OK @ mdaoustですが、各ステップでどのように学習率を得ることができますか?私はソン・キムの提案を試みたが、平らな線を返すので、うまくいかなかった。ありがとう。 – Escachator