0

我在使用 Tensorflow 2 计算 DDPG 算法中的演员更新时遇到了一些问题。以下是评论家和演员更新的代码:

with tf.GradientTape() as tape: #persistent=True
   
   # compute current action values
   current_q = self.Q_model(stat_act.astype('float32'))
   
   # compute target action values
   action_next = TargetNet.p_model(states_next.astype('float32'))
   stat_act_next = np.concatenate((states_next,action_next),axis=1)
   target_q = TargetNet.Q_model(stat_act_next.astype('float32'))
   
   target_values = rewards+self.gamma*target_q
   

   loss_q = self.loss(y_true=target_values,y_pred=current_q)
               
             
variables_q = self.Q_model.trainable_variables
gradients_q = tape.gradient(loss_q, variables_q)
self.optimizer.apply_gradients(zip(gradients_q, variables_q))

with tf.GradientTape() as tape:
   current_actions = self.p_model(states.astype('float32'))
   current_q_pg = self.Q_model(np.concatenate((states.astype('float32'),
                                                             current_actions), 
                                                             axis=1))
   loss_p = - tf.math.reduce_mean(current_q_pg)

variables_p = self.p_model.trainable_variables
gradients_p = tape.gradient(loss_p, variables_p)
self.optimizer.apply_gradients(zip(gradients_p, variables_p))

这些更新是类方法的一部分,演员和评论家网络是分开指定的。问题是它gradient_p作为一个列表返回None。我不知道这段代码有什么问题。我完全知道我可以根据链式规则拆分策略梯度的计算,但我不知道如何计算关于使用tf.GradientTape. 我怎样才能正确地实现这部分?我不明白为什么tf.GradientTape不能回到演员网络的可训练变量并一次执行计算。

4

0 回答 0