blog icon indicating copy to clipboard operation
blog copied to clipboard

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

Open geektutu opened this issue 5 years ago • 21 comments

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

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

geektutu avatar Jun 27 '19 18:06 geektutu

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

ghost avatar Jun 29 '19 23:06 ghost

@Cingho 感谢你的支持~

geektutu avatar Jun 30 '19 01:06 geektutu

写的真是细致

fanquanjiang avatar Jun 30 '19 03:06 fanquanjiang

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

xiangyangfeng avatar Oct 21 '19 02:10 xiangyangfeng

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

geektutu avatar Oct 21 '19 06:10 geektutu

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

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

xiangyangfeng avatar Oct 21 '19 10:10 xiangyangfeng

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

geektutu avatar Oct 21 '19 11:10 geektutu

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

hu-1996-zhe avatar Mar 01 '20 07:03 hu-1996-zhe

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

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

ygygyeah avatar Mar 26 '20 10:03 ygygyeah

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

halbupt avatar May 03 '20 03:05 halbupt

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

halbupt avatar May 03 '20 11:05 halbupt

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

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

LeoWei1997 avatar May 14 '20 13:05 LeoWei1997

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

yanduoduan avatar Jul 08 '20 14:07 yanduoduan

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

MextusZ avatar Sep 02 '20 06:09 MextusZ

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

MextusZ avatar Sep 02 '20 06:09 MextusZ

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

cangllzhen avatar Apr 13 '21 08:04 cangllzhen

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

wendyzhang1114 avatar Sep 27 '21 03:09 wendyzhang1114

@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。

WeiqingAi avatar Sep 29 '21 09:09 WeiqingAi

@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 avatar May 01 '22 12:05 hoore

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])

hoore avatar May 01 '22 12:05 hoore

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

Sjtu-hyg avatar Dec 08 '22 10:12 Sjtu-hyg