尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【Tensorflow实战系列】TensorFlow实战14:实现估值网络(强化学习二)
1.估值网络简介在强化学习中除了上节提到的策略网络Policy Based直接选择Action的方法还有一种学习Action对应的期望值Expected Utility的方法称为Q-Learning和Plolicy Based方法一样 Q-Learning不依赖环境模型。在有限马尔科夫决策过程中Markov Decision Process中Q-Learning被证明最终可以找到最优的策略。简单来说将旧的Q-Learning函数向着学习目标当前获得的Reward加上下一步可获得的最大期望价值按一个较小的学习速率学习得到新的Q-Learning函数这个就是Q-Learning的具体的思想学习率决定了覆盖之前掌握信息的比例通常设为一个比较小的值如果设定的值比较大那么覆盖之前的信息比较多那么会造成整个网络的动荡。我们用来学习Q-Learning的模型可以是神经网络这样得到的模型即是估值网络。如果其中的神经网络比较深那就是DQN。在DQN的使用中会有很多的Trick。第一个是在DQN中引入卷积层第二个是Experience Replay第三个Trick就是可以再使用一个DQN网络来辅助训练第四个Trick如果再分拆出target DQN的方法上更进一步那就是Double DQN第五个Trick是使用dual DQN。2.GridWorld的任务代码实现#coding:utf-8#这里也是导入常用的依赖库#为了直接能够在终端中运行代码我还是把魔法命定注释掉了具体的魔法命令的解释可以看上一个实战importnumpyasnpimportrandomimportitertoolsimportscipy.miscimportmatplotlib.pyplotaspltimporttensorflowastfimportos# %matplotlib inline#先是创建环境内物体对象的classclassgameOb():def__init__(self,coordinates,size,intensity,channel,reward,name):self.xcoordinates[0]self.ycoordinates[1]self.sizesize self.intensityintensity self.channelchannel self.rewardreward self.namename#创建GridWorld环境的classclassgameEnv():def__init__(self,size):self.sizeXsize self.sizeYsize self.actions4self.objects[]aself.reset()plt.imshow(a,interpolationnearest)#hero是用户控制的对象4个goal的reward为1 2个fire的reward为-1defreset(self):self.objects[]herogameOb(self.newPosition(),1,1,2,None,hero)self.objects.append(hero)goalgameOb(self.newPosition(),1,1,1,1,goal)self.objects.append(goal)holegameOb(self.newPosition(),1,1,0,-1,fire)self.objects.append(hole)goal2gameOb(self.newPosition(),1,1,1,1,goal)self.objects.append(goal2)hole2gameOb(self.newPosition(),1,1,0,-1,fire)self.objects.append(hole2)goal3gameOb(self.newPosition(),1,1,1,1,goal)self.objects.append(goal3)goal4gameOb(self.newPosition(),1,1,1,1,goal)self.objects.append(goal4)stateself.renderEnv()self.statestatereturnstate#实现英雄角色移动的方向01 23分别代表下上 左右defmoveChar(self,direction):heroself.objects[0]heroXhero.x heroYhero.yifdirection0andhero.y1:hero.y-1ifdirection1andhero.yself.sizeY-2:hero.y1ifdirection2andhero.x1:hero.x-1ifdirection3andhero.xself.sizeX-2:hero.x1self.objects[0]hero#定义新的位置defnewPosition(self):iterables[range(self.sizeX),range(self.sizeY)]points[]fortinitertools.product(*iterables):points.append(t)currentPositions[]forobjectAinself.objects:if(objectA.x,objectA.y)notincurrentPositions:currentPositions.append((objectA.x,objectA.y))forposincurrentPositions:points.remove(pos)locationnp.random.choice(range(len(points)),replaceFalse)returnpoints[location]#定义checkGoal函数用来检查hero是否触碰了goal或者firedefcheckGoal(self):others[]forobjinself.objects:ifobj.namehero:heroobjelse:others.append(obj)forotherinothers:ifhero.xother.xandhero.yother.y:self.objects.remove(other)ifother.reward1:self.objects.append(gameOb(self.newPosition(),1,1,1,1,goal))else:self.objects.append(gameOb(self.newPosition(),1,1,0,-1,fire))returnother.reward,Falsereturn0.0,False#渲染图像尺寸defrenderEnv(self):anp.ones([self.sizeY2,self.sizeX2,3])a[1:-1,1:-1,:]0heroNoneforiteminself.objects:a[item.y1:item.yitem.size1,item.x1:item.xitem.size1,item.channel]item.intensity bscipy.misc.imresize(a[:,:,0],[84,84,1],interpnearest)cscipy.misc.imresize(a[:,:,1],[84,84,1],interpnearest)dscipy.misc.imresize(a[:,:,2],[84,84,1],interpnearest)anp.stack([b,c,d],axis2)returna#定义执行的Action的方法defstep(self,action):self.moveChar(action)reward,doneself.checkGoal()stateself.renderEnv()returnstate,reward,done#设置尺寸为5envgameEnv(size5)#定义DQNDeep Q-Network网络classQnetwork():def__init__(self,h_size):self.scalarInputtf.placeholder(shape[None,21168],dtypetf.float32)self.imageIntf.reshape(self.scalarInput,shape[-1,84,84,3])self.conv1tf.contrib.layers.convolution2d(inputsself.imageIn,num_outputs32,kernel_size[8,8],stride[4,4],paddingVALID,biases_initializerNone)self.conv2tf.contrib.layers.convolution2d(inputsself.conv1,num_outputs64,kernel_size[4,4],stride[2,2],paddingVALID,biases_initializerNone)self.conv3tf.contrib.layers.convolution2d(inputsself.conv2,num_outputs64,kernel_size[3,3],stride[1,1],paddingVALID,biases_initializerNone)self.conv4tf.contrib.layers.convolution2d(inputsself.conv3,num_outputs512,kernel_size[7,7],stride[1,1],paddingVALID,biases_initializerNone)self.streamAC,self.streamVCtf.split(self.conv4,2,3)self.streamAtf.contrib.layers.flatten(self.streamAC)self.streamVtf.contrib.layers.flatten(self.streamVC)self.AWtf.Variable(tf.random_normal([h_size//2,env.actions]))self.VWtf.Variable(tf.random_normal([h_size//2,1]))self.Adavantagetf.matmul(self.streamA,self.AW)self.Valuetf.matmul(self.streamV,self.VW)self.Qoutself.Valuetf.subtract(self.Adavantage,tf.reduce_mean(self.Adavantage,reduction_indices1,keep_dimsTrue))self.predicttf.argmax(self.Qout,1)self.targetQtf.placeholder(shape[None],dtypetf.float32)self.actionstf.placeholder(shape[None],dtypetf.int32)self.actions_onehottf.one_hot(self.actions,env.actions,dtypetf.float32)self.Qtf.reduce_sum(tf.multiply(self.Qout,self.actions_onehot),reduction_indices1)self.td_errortf.square(self.targetQ-self.Q)self.losstf.reduce_mean(self.td_error)self.trainertf.train.AdamOptimizer(learning_rate0.0001)self.UpdateModelself.trainer.minimize(self.loss)#实现Experience Replay策略classexperience_buffer():def__init__(self,buffer_size50000):self.buffer[]self.buffer_sizebuffer_sizedefadd(self,experience):iflen(self.buffer)len(experience)self.buffer_size:self.buffer[0:(len(experience)len(self.buffer))-self.buffer_size][]self.buffer.extend(experience)defsample(self,size):returnnp.reshape(np.array(random.sample(self.buffer,size)),[size,5])#把当前state扁平为1维向量的函数defprocessState(states):returnnp.reshape(states,[21168])#更新模型参数defupdateTargetGraph(tfVars,tau):total_varslen(tfVars)op_holder[]foridx,varinenumerate(tfVars[0:total_vars//2]):op_holder.append(tfVars[idxtotal_vars//2].assign((var.value()*tau)((1-tau)*tfVars[idxtotal_vars//2].value())))returnop_holderdefupdateTarget(op_holder,sess):foropinop_holder:sess.run(op)#设置一些训练参数batch_size32update_freq4y.99startE1endE0.1anneling_steps10000.num_episodes10000pre_train_steps10000max_epLength50load_modelFalsepath./dqnh_size512tau0.001#初始化mainQNQnetwork(h_size)targetQNQnetwork(h_size)inittf.global_variables_initializer()trainablestf.trainable_variables()targetOpsupdateTargetGraph(trainables,tau)myBufferexperience_buffer()estartE stepDrop(startE-endE)/anneling_steps rList[]total_steps0savertf.train.Saver()ifnotos.path.exists(path):os.makedirs(path)#创建默认的sessionwithtf.Session()assess:ifload_modelTrue:print(Load Model...)ckpttf.train.get_checkpoint_state(path)saver.restore(sess,ckpt.model_checkpoint_path)sess.run(init)updateTarget(targetOps,sess)foriinrange(num_episodes1):episodeBufferexperience_buffer()senv.reset()sprocessState(s)dFalserAll0j0whilejmax_epLength:j1ifnp.random.rand(1)eortotal_stepspre_train_steps:anp.random.randint(0,4)else:asess.run(mainQN.predict,feed_dict{mainQN.scalarInput:[s]})[0]s1,r,denv.step(a)s1processState(s1)total_steps1episodeBuffer.add(np.reshape(np.array([s,a,r,s1,d]),[1,5]))iftotal_stepspre_train_steps:ifeendE:e-stepDropiftotal_steps%(update_freq)0:trainBatchmyBuffer.sample(batch_size)Asess.run(mainQN.predict,feed_dict{mainQN.scalarInput:np.vstack(trainBatch[:,3])})Qsess.run(targetQN.Qout,feed_dict{targetQN.scalarInput:np.vstack(trainBatch[:,3])})doubleQQ[range(batch_size),A]targetQtrainBatch[:,2]y*doubleQ _sess.run(mainQN.UpdateModel,feed_dict{mainQN.scalarInput:np.vstack(trainBatch[:,0]),mainQN.targetQ:targetQ,mainQN.actions:trainBatch[:,1]})updateTarget(targetOps,sess)rAllr ss1ifdTrue:breakmyBuffer.add(episodeBuffer.buffer)rList.append(rAll)ifi0andi%250:print(episode,i,, average reward of last 25 episode,np.mean(rList[-25:]))ifi0andi%10000:saver.save(sess,path/model-str(i).cptk)print(Saved Model)saver.save(sess,path/model-str(i).cptk)rMatnp.resize(np.array(rList),[len(rList)//100,100])rMeannp.average(rMat,1)plt.plot(rMean)这个还是要训练好久不过还是蛮好玩的如果可以用强化学习训练一个监督机器人这样LZ就不会有拖延症啦O(∩_∩)O
RELATED

相关推荐

使用vs2015打开.pro文件报错:Project ERROR: Cannot run compiler ‘cl‘ -- 完美解决

使用vs2015打开.pro文件报错:Project ERROR: Cannot run compiler ‘cl‘ -- 完美解决

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/22 6:37:10
adb常用命令自查表

adb常用命令自查表

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/22 6:37:10
基于Spark2.x新闻网大数据实时分析可视化系统项目

基于Spark2.x新闻网大数据实时分析可视化系统项目

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/22 6:37:10
MORE NEWS

更多资讯

📰

OpenCore Legacy Patcher 3.0.0 上手指南:老 Intel Mac 安装最新 macOS 全流程

OpenCore Legacy Patcher 3.0.0 上手指南:老 Intel Mac 安装最新 macOS 全流程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy P…

📰

RevokeMsgPatcher 微信防撤回补丁:改几个字节,撤回消息本地留底

RevokeMsgPatcher 微信防撤回补丁:改几个字节,撤回消息本地留底 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址…

📰

10 分钟上手 AxisRL:从 Docker 环境到第一条 GRPO 训练命令的完整新手指南

【免费下载链接】axrl AxisRL is an agentic RL post-training framework built on SGLang rollout, Megatron training, and real-world agent workflows. 项目地址: https://gitcode.com/gh_mirrors/ax/axrl 点击查看 免费下载 AxisRL 是一个面向 agentic RL 的 …

📰

焊盘掉了别直接扔板:这招飞线修复,省了几千换板成本

干修板这行,谁没碰过掉焊盘的糟心事?拆芯片没等锡化透就敢硬撬,老板子常年高温烤得铜皮发脆,稍微用点力,“啪”一下焊盘连带表层走线掀起来一小块。新手一瞅直接慌神,完了,板废了,要…

📰

免费换回Win10任务栏:ExplorerPatcher教程

免费换回Win10任务栏:ExplorerPatcher教程 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher ExplorerPatcher是免费开源(…

📰

浏览器相关工具推荐:别再只会装一个 Chrome,真正好用的是这些插件和增强玩法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬