如何从另一个数组索引到张量张量流

问题描述:

我正在尝试为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] 
+0

它是生产值错误说'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))' –

+0

上述代码适用于您提供的示例。在你的情况下,看起来b [...,tf.newaxis]应该用b代替。 –

+0

谢谢。用b代替'b [...,tf.newaxis]'做到了。 –