我在使用 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
不能回到演员网络的可训练变量并一次执行计算。