我写了一个函数,它只对张量中的某些 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]
的g
和n
,用它们来找到 的值critic1_reshaped[i][g][n]
,然后把它们加在一起(所以总共应该加起来 7 对)。应该对每个样本都这样做,从而产生一个 shape=(64,) 输出张量。
我一直在试图将它变成一个列表理解或使用 reduce_sum(),但 TensorFlow 在尝试使用另一个张量进行索引时表现不佳。
有任何想法吗?