详情请见莫烦老师DQN主页:DQN 算法更新 (Tensorflow) - 强化学习 Reinforcement Learning | 莫烦Python
莫烦老师代码(没有我繁琐注释代码直通车):MorvanZhou/Reinforcement-learning-with-tensorflow
上一篇博客有代码版,可粘贴
参考文献:Playing Atari with Deep Reinforcement Learning
https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf
第一次在网上写文章,不知怎么注明参考出处,如涉及侵权问题请评论告诉我。
本人初入强化学习,看莫烦老师的课受益匪浅,再次由衷的感谢老师的无私奉献,笔芯❤~
由于本人不懂的地方太多,所以注释的比较多,当然也加入了老师的注释。供以后学习参考,和其他小白一起进步。
建议参考DQN算法的英文流程,我也不知道这种中文注释能在哪里更方便的上传,就在这里发好啦,这里排版没准乱如果真要参考,就拷到编辑器上吧
由于知乎好像关键字搜不到,我又搞了个博客
run_this.py代码
#更新的步骤
from maze_env import Maze
from RL_brain import DeepQNetwork#引入了自己写的maze_env,RL_brain模块中class maze,class DeepQNetwork
def run_maze():
step = 0#为了记录当前走的第几步,因为先要存储一些记忆,当记忆库中有一些东西的时候才去学习
for episode in range(300):
# initial observation
observation = env.reset()#环境给出初始坐标
while True:
# fresh env更新环境
env.render()
# RL choose action based on observation根据观测值选择一个动作,根据RL.choose_action,但这个函数只调用了q_eval,即只进行正向传播得到q值进行选择
action = RL.choose_action(observation)
# RL take action and get next observation and reward选择动作后得到观测值,奖励,是否终结done的信息
observation_, reward, done = env.step(action)
RL.store_transition(observation, action, reward, observation_)##重要:存储记忆:现在这步观测值,采取的动作。会得到的奖励,采取行动后下一步观测值
# 控制学习起始时间和频率 (先累积一些记忆再开始学习)
if (step > 200) and (step % 5 == 0):#当步数大于两百的时候才开始学习,每五步学习一次,200步之前跳过learn,并且选择
RL.learn()#其中会有反向训练第一个q_predict网络
# swap observation
observation = observation_#更新观测值
# break while loop when end of this episode
if done:
break
step += 1
# end of game
print('game over')
env.destroy()
if __name__ == "__main__":
# maze game
env = Maze()#引入环境
RL = DeepQNetwork(env.n_actions, env.n_features,
learning_rate=0.01,
reward_decay=0.9,
e_greedy=0.9,
replace_target_iter=200, # 每 200 步替换一次 target_net 的参数
memory_size=2000,# 记忆上限
output_graph=False # 是否输出 tensorboard 文件
)
env.after(100, run_maze)
env.mainloop()
RL.plot_cost() # 观看神经网络的误差曲线
RL_brain.py代码
import numpy as np
import tensorflow as tf
np.random.seed(1)
tf.set_random_seed(1)
# Deep Q Network off-policy
class DeepQNetwork:
def __init__(
self,
n_actions,#输出多少个action的值
n_features,#接受多少个观测值的相关特征
learning_rate=0.01,#NN中learning_rate学习速率
reward_decay=0.9,#Q-learning中reward衰减因子
e_greedy=0.9,
replace_target_iter=300,#更新Q现实网络参数的步骤数
memory_size=500,#存储记忆的数量
batch_size=32,#每次从记忆库中取的样本数量
e_greedy_increment=None,
output_graph=False,
):
self.n_actions = n_actions#由maze得4
self.n_features = n_features#由maze得2
self.lr = learning_rate
self.gamma = reward_decay
self.epsilon_max = e_greedy#
self.replace_target_iter = replace_target_iter#隔多少步后将target net 的参数更新为最新的参数
self.memory_size = memory_size#整个记忆库的容量,即RL.store_transition(observation, action, reward, observation_)有多少条
self.batch_size = batch_size#随机梯度下降SGD会用到
self.epsilon_increment = e_greedy_increment#表示不断扩大epsilon,以便有更大的概率拿到好的值
self.epsilon = 0 if e_greedy_increment is not None else self.epsilon_max#如果e_greedy_increment没有值,则self.epsilon设置为self.epsilon_max=0.9
# total learning step
s