いいえ、学習率LR=tf.placeholder(tf.float32,[])
のプレースホルダを作成し、トレーニングステップのfeed_dict引数として関数の値を使用するだけです。
チュートリアル:私は、セッションを閉じられることはありません
x=tf.placeholder([None,dim_x],tf.float32)
target=tf.placeholder([None,dim_target],tf.float32)
LR=tf.placeholder([],tf.float32)
#a list of operations on x to get y_pred
y_pred=...
#Your loss
loss=your_loss_function(y_pred,target)
acc=accuracy(y_pred,target)
#I am now passing the placeholder LR as a learning rate
train_step = tf.train.YourFavoriteOptimizer(LR).minimize(loss)
sess=tf.Session()
sess.run(tf.initialize_all_variables())
for i in xrange(training_steps):
acc_arg=sess.run(acc,feed_dict={x: batch_x, target: batch_target})
lr_val=DetermineLearningRate(acc_arg)
#lr is a scalar not a list
sess.run(train_step,feed_dict={x: batch_x, target: batch_target, LR: lr_val})
お知らせ:
ですから、これとあなたの学習率を計算する機能DetermineLearningRate()
ようになりますグラフを定義しているとします。 これを行うための他のよりエレガントな方法がありますが、私の意見では、これは最も簡単です。
あなたはLR=tf.div(1,acc)
などのテンソルを使ってテンソルaccから得られたテンソルとしてLRを定義することができ、ses.run()
を1回だけ呼び出すことができます。
LRには訓練できない変数を使用し、関数の結果にはtf.assign
を使用してください。
編集:操作がTFで実行されないようにするには、別の操作が完了する前にtf.control_dependencies()
を使用します。
しかし、外部関数は、次の反復の開始時に学習率を与える前に、精度(最初の反復の終了)を最初に取得する必要があります。これは学習率として値リストを渡すだけですか?これがどのように機能するかのサンプルがありますか? – Ritchie
それは役に立ちましたか? – jean
これまでのご協力ありがとうございます。しかし、私が言及した問題は以下の通りです。 私の外部関数が前のバッチから精度を得てTFが次のバッチで使用するための学習率を返さない限り、反復は動かないはずです。 1000年におけるiに対する '' ' : 私の外部関数は、ループである LR = determineLearningRate(精度) 精度= someFunctionToGetAccuracyFromTF(LR) ' '' – Ritchie