0

AIの問題に対して深いqラーニングネットワークを作成しようとしています。私は、形状(None, 5)の入力を取る形状(None, 3)のテンソルを生成する関数predict()を持っています。 (None, 3)の3は、各状態で取ることができる各アクションのq値に対応します。さて、トレーニングのステップでは、私はpredict()に何度も電話し、結果を使ってコストを計算し、モデルを訓練しなければなりません。これを行うために、以前の反復で特定の状態に対して取られたアクションのインデックスを含むリストであるcurrent_actionsという別のデータ配列も利用できます。他の配列からテンソルテンソルにインデックスを付けるには

発生する必要があるものである

current_states_outputs各行はQ値が選択されるべきである一方のみ(predict()の出力より3とは対照的に)、Q値とを含有するpredict()の出力から作成されたテンソルであるべきであるべき対応するインデックスcurrent_actionsに依存します。

例えば、current_states_output = [[1,2,3],[4,5,6],[7,8,9]]current_actions=[0,2,1]場合、手術後の結果は、私がこれを行うにはどうすればよい[1,6,8](更新)

すべきですか?私は次のことを試してみました

-

current_states_outputs = self.sess.run(self.prediction, feed_dict={self.X:current_states}) 
    current_states_outputs = np.array([current_states_outputs[a][current_actions[a]] for a in range(len(current_actions))]) 

私が基底にpredict()でセッションを実行し、通常のPython methordsを使用して必要でした。しかしこれはグラフの前のレイヤーからコストの接続を切り離すので、トレーニングは実行できません。ですから、私はテンソルフロー内にとどまり、テンソルフローテンソルそのものとしてすべてを保持するこの操作を行う必要があります。これをどうすれば管理できますか?あなたが試すことができ

答えて

1

tf.squeeze(tf.gather_nd(a,tf.stack([tf.range(b.shape[0])[...,tf.newaxis], b[...,tf.newaxis]], axis=2))) 

サンプルコード:形状は同じランクであってもよいが、合併から2と3 \tある必要があります。

a = tf.Variable(current_states_outputs) 
b = tf.Variable(current_actions) 
out = tf.squeeze(tf.gather_nd(a,tf.stack([tf.range(b.shape[0])[...,tf.newaxis], b[...,tf.newaxis]], axis=2))) 
sess = tf.InteractiveSession() 
tf.global_variables_initializer().run() 
sess.run(out) 

#output 
[1, 6, 8] 
+0

それは 'とValueErrorを言って値誤差を生産しています形状0と他の形状。 '100_1、[100,1,1] .' 私は 'current_states_outputs = np.random.rand(100、3)'という入力を試してみました。 ) 'と ' current_actions = np.random.randint(0,3、(100,1)) ' –

+0

上記のコードは、あなたが指定した例で動作します。あなたの場合は、b [...、tf.newaxis]のように見えますが、bで置き換えてください。 –

+0

ありがとうございます。 'b [...、tf.newaxis]'をbに置き換えました。 –

関連する問題