用DQN玩Atari游戏——Flappy bird
状态空间连续的任务
通过深度Q学习神经网络使我们设计的agent能独自玩这个游戏
游戏的动作空间维度为2(跳与不跳)
Reward 设置条件为游戏是否终止(即玩家是否死亡)
目标是值函数近似的Q值最大化,值函数又神经网络l2-loss学习
import 随机数是作episode归类的
deque存储return memory,有容量,放满后老的去掉,放进新的元组
γ折扣因子,frame_per_action折扣因子
observe 经过交互才可以学习,前100次不进行学习,只进行放样本,探索一定次数后边探索边学习,
deque() #把他看成一个list 里面存放了S,A,R集合
如果收敛了,Epsilon设为1
Q网络
三层卷积,两层全连接
输入层设置为placeholder
第一个卷积 relu初始化参数,然后maxpool,max pooling 整个图片被不重叠的分割成若干个同样大小的小块(pooling size)。每个小块内只取最大的数字,再舍弃其他节点后,保持原有的平面结构得出 output。
reshape 变成向量,摊平;然后全连接两次
输出 Q值和参数,return stateInput,QValue,W_conv1,b_conv1,W_conv2,b_conv2,W_conv3,b_conv3,W_fc1,b_fc1,W_fc2,b_fc2
训练设置
Q-action 选取要执行的
观察平均q值区域平缓则收敛,
adam优化器优化,把图存到log中,用来看曲线;若有checkpoint 加载,否则从头开始训练
训练:采样一个batch数据,分开状态动作 reward
计算y y_batch永远先计算下一个状态Q值,
如果终止是reward,否则是Q值最大的动作+reward
run 写到输入,
Q_value_avg, loss, loss_sum, Q_sum = self.session.run([self.avg_q, self.cost, self.loss_sum, \
self.qvalue_summary], {self.stateInput : state_batch,\
self.yInput : y_batch, self.actionInput : action_batch})
主函数 预处理 preprocess
灰度化处理并变成我们想要的尺寸
然后开始gamestate,然后得到游戏环境和动作,setInitState 把observervation拼接起来,
setPerception 设置下一个perception