莫烦⽼师,DQN代码学习笔记
function怎么记忆详情请见莫烦⽼师DQN主页:
莫烦⽼师代码(没有我繁琐注释代码直通车):
参考⽂献:Playing Atari with Deep Reinforcement Learning
看图⽚版代码,见下⼀篇,等我学会贴代码。。。
第⼀次在⽹上写⽂章,不知怎么注明参考出处,如涉及侵权问题请评论告诉我。
本⼈初⼊强化学习,看莫烦⽼师的课受益匪浅,再次由衷的感谢⽼师的⽆私奉献,笔芯❤~
由于本⼈不懂的地⽅太多,所以注释的⽐较多,当然也加⼊了⽼师的注释。供以后学习参考,和其他⼩⽩⼀起进步。
建议参考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 = set()#环境给出初始坐标
while True:
# fresh env更新环境
# RL choose action based on observation根据观测值选择⼀个动作
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):#当步数⼤于两百的时候才开始学习,每五步学习⼀次
RL.learn()
# 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
= learning_rate
self.gamma = reward_decay
self.epsilon_max = e_greedy#
<_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
self.learn_step_counter = 0#⽤这个记录学习了多少步,可以让self.epsilon根据这个步数来不断提⾼
# initialize zero memory [s, a, r, s_]
< = np.zeros((_size, n_features * 2 + 2))
#存储记忆的表
#⾏(⾼度)为存储记忆的数量
#列为(observation, action, reward, observation_)的长度
#对于⼀条记忆信息来说observation和observation_都有n_features的长度
#⽽action,reward都各⾃有⼀个单值信息
#则总列数为n_features+2+n_features
#创建 [target_net, evaluate_net]神经⽹络
self._build_net()
# 替换 target net 的参数
t_params = tf.get_collection('target_net_params')#tf.get_collection(key,scope=None)返回具有给定名称的集合中的值列表
#如果未将值添加到该集合,则为空列表。该列表按照收集顺序包含这些值。
e_params = tf.get_collection('eval_net_params')
e_params)]#tf.assign(ref,value,validate_shape=None,use_locking=None,name=None)
#该操作在赋值后输出⼀个张量,该张量保存'ref'的新值。函数完成了将value赋值给ref的作⽤
#zip()函数⽤于将可迭代的对象作为参数,将对象中对应的元素打包成⼀个个元组,然后返回由这些元组组成的列表。
self.sess = tf.Session()
if output_graph:
# $ tensorboard --logdir=logs
tf.summary.FileWriter("logs/", aph)
(tf.global_variables_initializer())
def _build_net(self):#搭建⽹络,q_next, q_eval 包含所有 action 的值
# ------------------ build evaluate_net ------------------预测值⽹络具备最新参数,最后输出q_eval
self.s = tf.placeholder(tf.float32, [None, self.n_features], name='s') # input输⼊当前状态,作为NN的输⼊
self.q_target = tf.placeholder(tf.float32, [None, self.n_actions], name='Q_target') # for calculating loss输⼊Q现实为了后⾯误差计算反向传递 #NN输出q_predict
with tf.variable_scope('eval_net'):
#⾸先对图层进⾏配置,w,b初始化,第⼀层⽹络的神经元数n_l1 #\表⽰没有[],()的换⾏
c_names, n_l1, w_initializer, b_initializer = \
['eval_net_params', tf.GraphKeys.GLOBAL_VARIABLES], 10, \
tf.random_normal_initializer(0., 0.3), tf.constant_initializer(0.1)
#c_name作为⼀个存储变量的集合,其名称为eval_net_params[],将q估计的参数都放⼊这个集合中
#Variable()构造函数或get_variable()⾃动将新变量添加到图形集合:GraphKeys.GLOBAL_VARIABLES(默认)。
#这个⽅便函数返回该集合的内容。
#⽤于调⽤参数,将q估计的参数都放在collection这个集合当中
#tf.random_normal_initializer(mean=0.0, stddev=1.0, seed=None, dtype=tf.float32)
#返回⼀个⽣成具有正态分布的张量的初始化器
#tf.constant_initializer可以简写为tf.Constant()初始化为常数
#tf.zeros_initializer()也可以简写为tf.Zeros()
#tf.ones_initializer(), 也可以简写为tf.Ones()
# 第⼀层. collections is used later when assign to target net
with tf.variable_scope('l1'):
w1 = tf.get_variable('w1', [self.n_features, n_l1], initializer=w_initializer, collections=c_names)
b1 = tf.get_variable('b1', [1, n_l1], initializer=b_initializer, collections=c_names)
#创建⼀个变量对于get_variable(),来说,如果已经创建的变量对象,就把那个对象返回,如果没有创建变量对象的话,就创建⼀个新的。 #tf.get_variable(name, shape=None, dtype=None,
# initializer=None, regularizer=None,
# trainable=True, collections=None, 这个collection表⽰The new variable is added to these collections
# caching_device=None, partitioner=None,
# validate_shape=True, custom_getter=None)
l1 = lu(tf.matmul(self.s, w1) + b1)#python有⼴播功能,l1输出维度[None,n_l1]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论