【问题标题】:How do I index from another array into a tensor tensorflow如何从另一个数组索引到张量张量流
【发布时间】:2017-08-17 15:48:04
【问题描述】:

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

需要发生的是current_states_outputs 应该是从predict() 的输出创建的张量,其中每一行仅包含一个q 值(而不是predict() 的输出中的三个),并且其中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 方法完成了所需的操作。但是因为这切断了成本与图的前几层的连接,所以无法进行任何训练。因此,我需要在 tensorflow 中执行此操作,并将所有内容保持为 tensorflow 张量本身。我该如何管理?

【问题讨论】:

    标签: python tensorflow deep-learning artificial-intelligence q-learning


    【解决方案1】:

    你可以试试,

    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 must be equal rank, but are 2 and 3 From merging shape 0 with other shapes. for 'stack_1' (op: 'Pack') with input shapes: [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] 就可以了。
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2018-06-09
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多