微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这个嵌套的 for 循环可以使用 tensorflow 函数重写以允许梯度计算吗?

如何解决这个嵌套的 for 循环可以使用 tensorflow 函数重写以允许梯度计算吗?

我编写了一个函数,它只对张量中的某些 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,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,11)) 张量还包含 BATCH_SIZE=64 个样本,先分为组 g,然后是节点 n。以下是示例 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 表现不佳。

有什么想法吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。