Python ValueError:没有为策略渐变中的任何变量提供渐变

Python ValueError:没有为策略渐变中的任何变量提供渐变,python,tensorflow,reinforcement-learning,gradient-descent,policy-gradient-descent,Python,Tensorflow,Reinforcement Learning,Gradient Descent,Policy Gradient Descent,我一直在尝试在强化学习中实现策略梯度算法。但是,在计算自定义损失函数的梯度时,我面临错误“ValueError:没有为任何变量提供梯度:”如下所示: def loss_function(prob, action, reward): prob_action = np.array([prob.numpy()[0][action]]) #prob is like ->[0.4900, 0.5200] and action is scalar index->1,0 log_

我一直在尝试在强化学习中实现策略梯度算法。但是,在计算自定义损失函数的梯度时,我面临错误“ValueError:没有为任何变量提供梯度:”如下所示:

def loss_function(prob, action, reward):

    prob_action = np.array([prob.numpy()[0][action]]) #prob is like ->[0.4900, 0.5200] and action is scalar index->1,0
    log_prob = tf.math.log(prob_action)
    loss = tf.multiply(log_prob, (-reward))
    return loss 
我计算的梯度如下:

def update_policy(policy, states, actions, discounted_rewards):
    opt = tf.keras.optimizers.SGD(learning_rate=0.1)

    for state, reward, action in zip(states, discounted_rewards, actions):
        with tf.GradientTape() as tape:
            prob = policy(state, training=True)
            loss = loss_function(prob, action, reward)
            print(loss)

        gradients = tape.gradient(loss, policy.trainable_variables)
        opt.apply_gradients(zip(gradients, policy.trainable_variables))
请帮我解决这个问题。
谢谢大家,

正如@gekrone在评论中指出的,这肯定是由于prob_动作是一个numpy数组而不是张量,导致梯度不流动。还要注意不要使用
.numpy()
方法。可能会坚持这样的观点

prob_action = prob[0][action]
...

这应该是可行的。

我认为这个错误意味着损失张量是不可微的,所以tensorflow不能计算损失对可训练变量的梯度。
loss\u函数中的某些东西正在中断从可训练变量到loss的路径。我不确定是什么导致了这个问题,它可能是
prob_action=np.array([prob.numpy()[0][action]])
;尝试将prob_操作保持为
tf.Tensor
而不是numpy数组。