我需要为定义的神经网络的变量计算梯度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}')
我得到以下错误:
属性错误:"NoneType"对象没有属性"shape"如何解决此问题?
直接索引y[actions[t]]
不可微,因此损失张量与图断开连接。
您可以重写代码以产生所有元素的损失,但使用输入二进制mask
仅选择一个元素。通过这种方式,您的最终损耗连接到所有输入(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]