我该如何解决这个使用 Tensorflow 进行自动微分的问题?

How can I fix this problem of automated differentiation with Tensorflow?

我需要计算已定义神经网络变量的梯度 wrt 损失,损失计算正确但梯度为 None。代码如下:

variables = self.model.trainable_variables
for var in variables:
   print("{}".format(var.name)
with tf.GradientTape() as tape:

   y = self.model.predict(states[t])
   y = tf.reshape(y, constants.NUM_ACTIONS)
   loss = y[actions[t]]

grads = tape.gradient(loss, variables)

print("Information about gradients")
for var, g in zip(variables, grads):
   print(f'{var.name}, shape: {g.shape}')

我收到以下错误:

AttributeError: 'NoneType' object has no attribute 'shape'

我该如何解决这个问题?

直接索引 y[actions[t]] 不可微分,因此您的损失张量与图表断开连接。

您可以重写代码以产生所有元素的损失,但使用输入二进制 mask 到 select 只有一个元素。这样你的最终损失连接到所有输入(states[t]mask[t])。

with tf.GradientTape() as tape:
   y = self.model.predict(states[t])
   y = tf.reshape(y, constants.NUM_ACTIONS)
   loss = y * mask[t]