geektutu / blog

极客兔兔的博客,Coding Coding 创建有趣的开源项目。
https://geektutu.com
Apache License 2.0
168 stars 21 forks source link

TensorFlow 2.0 (八) - 强化学习 DQN 玩转 gym Mountain Car | 极客兔兔 #16

Open geektutu opened 5 years ago

geektutu commented 5 years ago

https://geektutu.com/post/tensorflow2-gym-dqn.html

TensorFlow 2.0 入门系列文章,第八篇,强化学习 DQN (Deep Q-Learning) 玩转 OpenAI gym game MountainCar-v0。

ghost commented 5 years ago

大佬可敬 希望大佬以后的博客不会被无良爬走...

geektutu commented 5 years ago

@Cingho 感谢你的支持~

fanquanjiang commented 5 years ago

写的真是细致

xiangyangfeng commented 4 years ago

感谢你的讲解,我想问一下,这个实例中创建了两个网络,model和target_model,那这个属于DDQN,还是单个的DQN?

geektutu commented 4 years ago

@xiangyangfeng 属于DDQN,如果是DQN的话,仅是将Q-Learning的Q表转为神经网络来拟合映射,不会有2个模型。这个示例,仅用DQN一直没办法拟合。

xiangyangfeng commented 4 years ago

@geektutu @xiangyangfeng 属于DDQN,如果是DQN的话,仅是将Q-Learning的Q表转为神经网络来拟合映射,不会有2个模型。这个示例,仅用DQN一直没办法拟合。

那是不是说,DQN中还是要建立一个Q表,并依据Q-learning进行更新,然后以Q表中的预测值来作为标签训练神经网络,逐步把Q表拟合成函数?

geektutu commented 4 years ago

@xiangyangfeng 直接使用神经网络代替Q表,没有Q表了。

hu-1996-zhe commented 4 years ago

楼主,你的这个代码用了多大的内存啊,我的16G居然不够

ygygyeah commented 4 years ago

@hu-1996-zhe 楼主,你的这个代码用了多大的内存啊,我的16G居然不够

你好,你的问题解决了吗?

halbupt commented 4 years ago

我的也是内存不够,我运行莫烦老师的tensorflow1.0版本的DQN就可以

halbupt commented 4 years ago

我又租了一个服务器2080ti,跑2个小时可以跑通。

LeoWei1997 commented 4 years ago

@halbupt 我又租了一个服务器2080ti,跑2个小时可以跑通。

这个网络不大,怎么会占这么多内存。。哪位大佬解读一下

yanduoduan commented 4 years ago

一直没整明白,为什么会内存不够使用(16G),运行过成功内存直线上升,然后就中断了!

MextusZ commented 4 years ago

内存不断上升的主要原因应该是tensorflow2.0中kears底层实现有问题,在循环中没有将训练用的计算节点及时清理导致内存占用越来越大,更新到tensorflow2.1后这个问题就被解决了

MextusZ commented 4 years ago

Double DQN的意思是指采用两个模型吗,根据我的理解DDQN和DQN的应该都有两个模型,区别的地方应该在Q值的更新方法上。

cangllzhen commented 3 years ago

根据各位大佬的回答,将tensorflow升级到了2.1版本,解决了内存问题,但是发现执行效率竟然跟1.0版本使用静态图差了50倍左右,有大佬知道怎么回事吗

wendyzhang1114 commented 2 years ago

Q[i][a] = (1 - lr) * Q[i][a] + lr * (reward + factor * np.amax(Q_next[i])) 这应该时DQN的更新Q_TARGET的方法,而不是DDQN。文中写了DDQN有点歧义,希望可以把两种算法更新Q_target的方法都写一下。

WeiqingAi commented 2 years ago

@wendyzhang1114 Q[i][a] = (1 - lr) * Q[i][a] + lr * (reward + factor * np.amax(Q_next[i])) 这应该时DQN的更新Q_TARGET的方法,而不是DDQN。文中写了DDQN有点歧义,希望可以把两种算法更新Q_target的方法都写一下。

确实不是DDQN,只是DQN。

hoore commented 2 years ago

@WeiqingAi

@wendyzhang1114 Q[i][a] = (1 - lr) * Q[i][a] + lr * (reward + factor * np.amax(Q_next[i])) 这应该时DQN的更新Q_TARGET的方法,而不是DDQN。文中写了DDQN有点歧义,希望可以把两种算法更新Q_target的方法都写一下。

确实不是DDQN,只是DQN。

这也不是DQN,DQN应该Q = self.target_model.predict(s_batch),而文章中Q不是target,而是评估模型

hoore commented 2 years ago

DQN应该Q = self.target_model.predict(s_batch),而文章中Q不是target,而是评估模型.补充下DDQN,但我用文章中方式、原始DQN方式、DDQN方式测试打砖块,参数都一样,效果居然是文章中更新Q表方式最好,目前还不清楚原因。

补充DQN:

    ###这里区别:DQN应该更新是目标Q,用目标Q训练评估
    Q = self.target_model.predict(s_batch)
    Q_next = self.target_model.predict(next_s_batch)

    # 使用公式更新训练集中的Q值
    for i, replay in enumerate(replay_batch):
        _, a, _, reward = replay
        Q[i][a] = (1 - lr) * Q[i][a] + lr * (reward + factor * np.amax(Q_next[i]))

    # 传入网络进行训练
    self.model.fit(s_batch, Q, verbose=0)

补充DDQN:

    Q = self.target_model.predict(s_batch)
    Q_next = self.target_model.predict(next_s_batch)
    Q_modle_next = self.model.predict(next_s_batch)

    # 使用公式更新训练集中的Q值
    for i, replay in enumerate(replay_batch):
        _, a, _, reward = replay
       ###区别在这里
        j = np.argmax(Q_modle_next[i])
        Q[i][a] = (1 - lr) * Q[i][a] + lr * (reward + factor * Q_next[i][j])
Sjtu-hyg commented 1 year ago

迭代157次还没收敛,话说,我CPU占用高,GPU就一点,训练157次,接近1.2H