「已注销」 2019-01-24 14:37 采纳率: 0%
浏览 553

tensorflow 实现 DQN2013版 计算max(Q(snext))代码问题

图片说明
DQN中误差计算是由上式的均方误差来定义的,我的神经网络的输出是Qeval,是Action个q值,但是我在用tensenflow代码实现max(Q(snext)) 时遇到了问题,就是我有两个版本
版本一用one-hot编码动作,然后用动作和Qeval向量相乘的到max(Q(snext))
版本二没有使用动作,直接用tf.reduce mean(Qeval,axis=1)来直接得到max(Q(snext))。
那么问题来了:(每训练100步,然后再测试十次取平均,使用的gym.cartPole-v0环境)我用版本一,大约第1100回合就可以达到200分。
我用版本二,效果却相差有点大。我想问:这两个版本的计算效果都是一样的,可为什么效果却差很多呢(运行了多次,结果都一样)?
版本一效果版本2效果

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 19:11
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在TensorFlow中,为了计算一个动作的最大Q值,可以使用以下方法:

    # Q_eval 表示当前网络的输出
    Q_eval = tf.reduce_max(self.Q_value, axis=1)
    
    # 使用最大Q值作为目标
    target_Q = y_j + gamma * max(Q_next_values)
    

    其中gamma为折扣因子,表示对未来的奖励进行折扣。

    在这个例子中,您已经成功地实现了版本一的代码。现在,请尝试将代码中的one_hot_action更改为tf.argmax(Q_eval, axis=1)以获得动作的最大Q值,并再次训练模型。这应该会提供更好的结果。

    评论

报告相同问题?