2016-12-01 11 views
1

私はA3Cを学習するためのA3C強化学習アルゴリズムのオープンコードを実行しようとしていますA3C codeTensorflowバージョン0.12のtf.Variable.ref()の代替手段は何ですか?

ただし、いくつかのエラーがあり、それ以外は修正できます。 コードでは、tf.Variableのメンバ関数であるref()が使用されますが(12)、最近のテンソルフローバージョン0.12rcでは、その関数は推奨されなくなりました。 私はそれを置き換える最善の方法が何であるか分かりません(著者がref()を使用した理由を正確に理解できません)。変数自体に変更したばかり(たとえばv.ref()v)は、エラーはありませんでしたが、報酬は変更されません。変数が正しく更新されていないため、学習できないようです。

コードを修正するための適切な方法を教えてください。

答えて

4

tf.Variable.read_value()は、TensorFlow 0.12以降のtf.Variable.ref()の代わりです。

このメソッドのユースケースは、説明するのがやや難解で、異なるデバイス上のリモート変数を複数回使用するとキャッシュされた値を使用するキャッシング動作によって動機付けられます。あなたは、次のコードを持っているとしましょう:

with tf.device("/cpu:0") 
    v = tf.Variable([[1.]]) 

with tf.device("/gpu:0") 
    # The value of `v` will be captured at this point and cached until `m2` 
    # is computed. 
    m1 = tf.matmul(v, ...) 

with tf.control_dependencies([m1]) 
    # The assign happens (on the GPU) after `m1`, but before `m2` is computed. 
    assign_op = v.assign([[2.]]) 

with tf.control_dependencies([assign_op]): 
    with tf.device("/gpu:0"): 
    # The initially read value of `v` (i.e. [[1.]]) will be used here, 
    # even though `m2` is computed after the assign. 
    m2 = tf.matmul(v, ...) 

sess.run(m2) 

あなたが後でもう一度変数を読み取ることTensorFlowを強制的にtf.Variable.read_value()を使用することができ、そしてそれは依存関係が所定の位置にあるものは何でも制御の対象となります。 m2を計算するときに割り当てるの結果を確認したい場合、あなたはプログラムの最後のブロックを変更したいので、次のように:OPSのすべてが同じであった場合

with tf.control_dependencies([assign_op]): 
    with tf.device("/gpu:0"): 
    # The `read_value()` call will cause TensorFlow to transfer the 
    # new value of `v` from the CPU to the GPU before computing `m2`. 
    m2 = tf.matmul(v.read_value(), ...) 

が(現在、なお同じデバイス上のオペアンプへの入力として使用された場合、TensorFlowは変数のコピーを作成しないため、は read_value()を使用する必要があります。—変数を待ち行列にエンキューしよう!—これは、変数のメモリモデルの拡張に取り組んでいる理由の1つです。

+0

Tha迅速かつ詳細な答えを得るために非常に多くの。非常に有益で、私はよく理解できました。 – user270700

関連する問題