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

Python 如何从另一个数组索引到张量张量流,python,tensorflow,deep-learning,artificial-intelligence,q-learning,Python,Tensorflow,Deep Learning,Artificial Intelligence,Q Learning,我正试图为人工智能中的一个问题编写一个深度q学习网络。我有一个函数predict(),它产生一个形状张量(无,3)输入一个形状(无,5)。(无,3)中的3对应于在每个状态下可以采取的每个动作的q值。现在,在训练步骤中,我必须多次调用predict(),并使用结果计算成本和训练模型。为此,我还提供了另一个名为current_actions的数据数组,它是一个列表,包含在以前迭代中针对特定状态采取的操作的索引 需要做的是,current\u states\u outputs应该是一个由predict

我正试图为人工智能中的一个问题编写一个深度q学习网络。我有一个函数
predict()
,它产生一个形状张量
(无,3)
输入一个形状
(无,5)
(无,3)
中的3对应于在每个状态下可以采取的每个动作的q值。现在,在训练步骤中,我必须多次调用
predict()
,并使用结果计算成本和训练模型。为此,我还提供了另一个名为
current_actions
的数据数组,它是一个列表,包含在以前迭代中针对特定状态采取的操作的索引

需要做的是,
current\u states\u outputs
应该是一个由
predict()
的输出创建的张量,其中每行只包含一个q值(而不是
predict()
的输出中的三个q值)应选择哪一个q值应取决于
当前动作的相应索引

例如,如果
current\u states\u output=[1,2,3],[4,5,6],[7,8,9]
current\u 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方法完成了所需的操作。但由于这切断了成本与图表前几层的联系,因此无法进行任何培训。所以,我需要在tensorflow中做这个操作,并保持一切都是tensorflow张量本身。我该怎么办呢?

你可以试试

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]
你可以试试

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:Shapes必须是相等的秩,但在将shape0与其他形状合并时为2和3。对于输入形状为[100,1]、[100,1,1]、[100,1,1]的“堆栈1”(op:'Pack')。
我尝试了输入形式为
current\u states\u outputs=np.random.rand(100,3)
current\u actions=np.random.randint(0,3,(100,1))
以上代码适用于您提供的示例。在您的情况下,看起来像b[…,tf.newaxis]应该替换为b。谢谢。将
b[…,tf.newaxis]
替换为b完成了此操作。这会产生一个值错误,表示
ValueError:形状的秩必须相等,但将形状0与其他形状合并为2和3。对于输入形状为[100,1]、[100,1,1]、[100,1,1]的“堆栈1”(op:'Pack')。
我尝试了输入形式为
current\u states\u outputs=np.random.rand(100,3)
current\u actions=np.random.randint(0,3,(100,1))
以上代码适用于您提供的示例。在您的情况下,看起来像b[…,tf.newaxis]应该替换为b。谢谢。用b替换
b[…,tf.newaxis]
成功了。