我正在尝试使用tf.GradientTape计算梯度。当我尝试使用loss和Model.trainable_weights(tf.keras.Model)作为输入来执行此操作时,结果将返回None数组。我究竟做错了什么?我使用的tensorflow版本是1.13.0。
implemneted算法是OnPolicy DQN(不是通常的DQN),因此我不使用目标网络(在常规DQN代码中用作行为网络)。因此,我想区分错误,在下面的代码中,该错误定义为Y(即R + gamma * max_a Q(s',a'))和Q(s,a)的最小批量MSE。
rowSums(df)
#[1] 100 100
答案 0 :(得分:1)
尝试将更新功能更改为:
def update(self, state, action, target):
# target: R + gamma * Q(s',a')
# calculate Q(s,a)
q_values = self.model(tf.convert_to_tensor(state[None, :], dtype=tf.float32))
actions_one_hot = tf.one_hot(action, self.num_action, 1.0, 0.0)
action_probs = tf.reduce_sum(actions_one_hot * q_values, reduction_indices=-1)
# Minibatch MSE => (1/batch_size) * (R + gamma * Q(s',a') - Q(s,a))^2
loss = tf.reduce_mean(tf.squared_difference(target, action_probs))
return loss
我认为通过预测函数中的.numpy()调用,磁带将失去对权重的引用。 (我尚未测试答案)