3

我写了一个函数,它只对张量中的某些 q 值求和,这些值是与先前采取的操作相对应的值。我需要这个函数是自动微分的,但是我当前的实现使用了一个带有嵌套 for 循环的 numpy 数组,所以 TensorFlow 计算图无法跟踪它,我得到了错误:

ValueError: No gradients provided for any variable: ['critic_network/fc1/kernel:0', 'critic_network/fc1/bias:0', 'critic_network/fc2/kernel:0', 'critic_network/fc2/bias:0', 'critic_network/q/kernel:0', 'critic_network/q/bias:0'].

这是有问题的功能:

# Get q-values for the actions taken at the sampled states (= q)
critic1_reshaped = tf.reshape( self.critic_1(states), [BATCH_SIZE, NUM_BOTS, NUM_NODES] )  # critic values shape = (64, 132) => (64, 12, 11) reshaped
q1 = np.zeros(BATCH_SIZE)
for i, batch in enumerate(actions):  # action shape = (BATCH_SIZE, 7, 2)  # each action is a list of 7 [group, node] lists
    for action in batch:
        group = action[0]
        node = action[1]
        value = critic1_reshaped[i, group, node-1]
        q1[i] += value

在结构方面,actions (shape=(64,7,2))张量包含BATCH_SIZE=64样本,每个样本i的形式为:

actions[i] = [[g0, n0],[g1, n1],[g2, n2],[g3, n3],[g4, n4],[g5, n5],[g6, n6]].

critic1_reshaped (shape=(64,12,11))张量还包含BATCH_SIZE=64样本,首先分为组,然后是g节点n。这是 sample 组g的示例i

critic1_reshaped[i][g] = [n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10]


本质上,我想抓住每个action[i]gn,用它们来找到 的值critic1_reshaped[i][g][n],然后把它们加在一起(所以总共应该加起来 7 对)。应该对每个样本都这样做,从而产生一个 shape=(64,) 输出张量。

我一直在试图将它变成一个列表理解或使用 reduce_sum(),但 TensorFlow 在尝试使用另一个张量进行索引时表现不佳。

有任何想法吗?

4

0 回答 0