如何从另一个数组索引到张量张量流
问题描述:
我正在尝试为AI中的问题编写深度q-学习网络。我有一个函数predict()
,它产生一个形状(None, 3)
的张量,输入形状(None, 5)
。 (None, 3)
中的3对应于每个状态下可以采取的每个动作的q值。现在,在训练步骤中,我必须多次呼叫predict()
,并使用结果计算成本并训练模型。为此,我还有另一个可用的数据数组,名为current_actions
,它是一个列表,其中包含以前迭代中为特定状态采取的操作索引。如何从另一个数组索引到张量张量流
需要采取什么是current_states_outputs
应该从predict()
输出创建的张量,其中每行只包含一个q值(从的predict()
输出反对3)和q值应选择哪些应取决于相应的指标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。但是因为这样可以切断图的前几层的成本,所以不能进行培训。所以,我需要做这个操作,保持在张量流中,并且把所有东西都保持为张量张量本身。我怎样才能管理这个?
答
你可以试试,
tf.squeeze(tf.gather_nd(a,tf.stack([tf.range(b.shape[0])[...,tf.newaxis], b[...,tf.newaxis]], axis=2)))
示例代码:
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]
它是生产值错误说'ValueError异常:形状必须是同等级别,但2和3 \t从合并形状0与其他形状。对于'stack_1'(op:'Pack'),输入形状为:[100,1],[100,1,1]。' 我尝试了以'current_states_outputs = np.random.rand(100,3 )'和 'current_actions = np.random.randint(0,3,(100,1))' –
上述代码适用于您提供的示例。在你的情况下,看起来b [...,tf.newaxis]应该用b代替。 –
谢谢。用b代替'b [...,tf.newaxis]'做到了。 –