本文主要介绍如何关闭谷歌浏览器中的恐龙游戏(谷歌chrome恐龙),下面一起看看如何关闭谷歌浏览器中的恐龙游戏(谷歌chrome恐龙)相关资讯。
夏益国·溥仪来自奥菲神庙。
量子比特制作|官方账号qbitai
什么!没有联网!!
当我清楚地连接到互联网时,为什么我要访问页面?
没什么!法!战斗!打开!
冷静点。
作为谷歌遗传算法,让一个ai系统在浏览器中脱颖而出。
我们截取了精华,就是下面这段视频。
移动板:
速度快到可以飞了
总而言之,一句话,这个ai可以轻松打20000分以上...
你能打多远?很有可能你可以。;不要播放这个结果。毕竟在chromedino.com页面上,人类玩家的历史最高分是18842。
但是上传这段视频的作者并没有详细透露他的方法,当然也没有给出公开的源地址。但事实并非如此。;没关系,其他人已经公开分享了更多的细节。
例如,有一个开源代码 iam恐龙和在github上,也是用神经网络遗传算法让恐龙跳的。
地址在这里:
美中不足的是,上述项目并没有附带太详细的解读。不过好消息是,最近有个外国师兄ravi munde列了一个很详细的教程。
本教程采用的方法是强化学习中的qlearning,比较适合初学者,对硬件要求不高。
量子比特处理的过程如下。
q学习理解/复习对于动物来说,强化学习的能力是与生俱来的。带孩子 以初学走路的孩子为例。如果孩子努力迈出第一步,他们会得到父母的鼓励——也许是掌声,也许是一块糖;但是如果孩子拒绝学走路,他的父母就不会给他糖果。强化学习就是根据这种激励行为设置的。
在这个游戏中,对于我们的ai恐龙来说,强化学习需要让他在没有监督的情况下实现不同动作的结果,并以获得高分作为最高激励。
强化学习的典型闭环
ravi munde用qlearning模拟了一个特殊的功能,驱动ai在不同的情况下做出正确的选择。
qlearning是强化学习的无模型实现,根据q值判断每个状态,此时采取行动可以获得什么样的奖励。样本q表让我们知道数据的结构。在恐龙跑酷游戏中,状态是当前游戏的截图,可以采取的动作是跳或者不跳[0,1]。
一个样本q表
ravi munde决定使用深度神经网络来决定小恐龙何时起飞,而且应该是在最简单的强化学习练习中。在现有的基础上,引入不同的参数来辅助它。
标记数据的缺乏使得强化学习非常不稳定。为了得到适合这个游戏的数据,蒙德决定让小恐龙跳上千次,记下每个动作的反馈,然后从数据中随机选取一些来训练模型。
但后来,蒙德发现他培养了一个固执的模型——模型坚信跳一定比不跳好。因此,为了让模型在训练时更多地在跳与不跳之间进行尝试,他引入了一个函数来确定动作的随机性,然后逐渐降低其值来减少随机性,最后让模型选择最有可能获得奖励的动作。
信用分配的问题可能会混淆模型——当前的奖励来自哪种行为?在恐龙跑酷游戏中,小恐龙可以 在半空中跳完之后就不能再跳了,但是恐龙在半空中的时候模型可能会给出跳跃指令,这就使得恐龙非常容易撞到仙人掌。
在这种情况下,负反馈的 击中仙人掌 实际上是先前跳跃决定的结果,而不是恐龙在半空中刚刚做出的跳跃的结果。
面对这个问题,可以引入贴现因子)γ来决定模型作用时看多远。γ间接解决了好评分配的问题。在这个游戏中,当γ=0.99时,模型意识到,在没有障碍物的情况下随便跳跃,会导致真正遇到障碍物时处于半空中,可以 不要继续跳了。
除了这两个参数,后面几乎不需要任何参数。
#游戏参数gamma = 0.99 #过往观察值衰减率原创0.99观察值= 50000。#训练前要观察的时间步长explore = 100000 #要退火的帧epsilon final _ epsilon = 0.0001 # epsilon的最终值initial _ epsilon = 0.1 # epsilon的起始值replay _ memory = 50000 #要记住的先前转换的数量batch = 32 # minibatchframe _ per _ action的大小= 1您需要准备的是
python 3.6
硒
打开履历
pil
硒的铬驱动剂
克拉斯
稍微解释一下这些工具。
要建立这个ai模型,你需要用python编程。而且游戏是用javascript写的。因此,我们不得不使用一些工具来更好地沟通。
selenium是一款流行的浏览器自动化工具,用于向浏览器发送操作指令,获取各种游戏参数。
界面做好了,还得想办法弄个游戏截图。selenium也可以,但是速度很慢,截图处理一次需要1秒左右。
使用pil和opencv可以更好的完成屏幕截图和图像预处理,帧率可以达到5fps。你可能认为它 它仍然很慢,但它 对付这个游戏就够了。
游戏模块的后续模块实现了python与浏览器的通信(使用selenium)。
*游戏class: s:使用chrome_options* get_crash:返回true如果代理as在障碍物上崩溃。从描述游戏状态的游戏中获取javascript变量* g:如果游戏正在进行,则为tru:向浏览器发送信号javascript以重新启动游戏* pr:发送single以按下按钮进入浏览器* get_scor:从javascript变量中获取当前游戏分数。暂停:暂停比赛r::关闭浏览器,结束游戏。; class gam: def _ _ init _ _(self,custom_config=tru: chrome _ options = optionschrome _ options . add _ argument( 禁用信息栏)自我。_driver = webdriver。chrome(executable _ path = chrome _ driver _ path,chrome _ options = chrome _ options)self。_ driver . set _ window _ position(x =10,y = 0) self。_ driver。set _ window _ size (200,300) self。_ driver。get(os . path . abspath(tensor flow后端的keras)构建模型:
# model hyper parameters learning _ rate = 1e4 img _ rows,img_cols = 40,20 img _ channels = 4 # we stack 4 frames actions = 2 d:打印( 现在我们建立模型 )model = sequentialmodel . add(conv2d(32,(8,8),strides=(4,4),padding = 相同 ,input_shape=(img_cols,img_rows,img _ channels))# 20 * 40 * 4 model . add(activation( ;relu ))model.add(conv2d(64,(4,4),strides=(2,2),padding = 相同 ))model.add(激活( relu ))model.add(conv2d(64,(3,3),strides=(1,1),padding = 相同 ))model.add(a激活( relu ))model . add(flatten)model . add(dense(512))model . add(activation( ;relu ))model . add(dense(actions))adam = adam(lr = l: * mod: #将之前的观测值存储在重放存储器中d = dequee#从文件系统加载#通过不做任何事情获得第一个状态do _ nothing = np . zeros(actions)do _ nothing[0]= 1 # 0 =不做任何事情,#1= jump x_t,r_0,terminal = game _ state . get _ state(do _ nothing)#获得下一步执行完动作s_t = np.stack((x_t,x_t,x_t,x_t),axis=2)。整形(1,20,40,4) #堆叠4个图像以创建占位符输入整形后的1 * 20 * 40 * 4 obs: #无休止的运行损耗= 0 q _ sa = 0 action _ index = 0 r _ t = 0 #奖励at t a_t = np.zeros([actions]) #在t #选择一个操作: #随机探索一个操作打印( 随机行动)action _ index = random . rand range(actions)a _ t[action _ ind: #预测输出q = model.predict(s_t) #输入一叠4张图像,得到预测max_q = np.argmax(q) #选择q值最大的索引action _ index = max _ q a _ t[action _ ind:ε=(initial _ :,:,:,:3],axis=3) #将新图像追加到输入堆栈并删除第一个#将转场存储在d d如果t观察到s _ t = s _ t1 t = t 1 print( 时间步长 ,t /epsilon 艾司隆/行动 ,action _ index /奖励 ,r_t, /q _ max ,np.max(q_sa), /损失 ,损失)
将此模型应用于从重播记忆中随机选择的批次:
def train batch(mini batch): for i in range(0,len(minibatch)):损耗= 0输入= np.zeros((batch,s_t.shape[1],s_t.shape[2],s _ t . shape[3])# 32,20,40,4 targets = np . zeros((inputs . shape[0],actions)) #32,2 state_t = minibatch[i][0] # 4d图像堆栈action _ t = mini batch[i][1]#这是动作索引reward _ t = mini batch[i][2]#由于动作的状态奖励_ t state _ t1 = mini batch[i][3]#下一个状态终端= mini batch[i][4]#代理是否由于动作输入而死亡或存活[i:i 1]= state _ t targets[i]= model . predict(state _ t)#预测的q值q _ sa = model . predict(stat:观察,只有在真的情况下才玩,否则训练d: game = gamedino = dino agent(game)game _ state = game _ sate(dino,game)model = build modeltrain network(model,game _ state)结果。
在这个模型中,小弟一周训练200万帧,其中前100万帧用于调整游戏参数修复bug,后100万帧真正用于训练。
现在,这个模型的最好成绩是265分。从下面的评分和损失变化图可以看出,模型的损失在最后100万帧是逐渐稳定且相对较低的,但会随时间波动。
游戏分数丢失最后100帧
目前的局限性虽然这个模型在未来表现的还算不错,但比起人类还是差了很多。
当然,唐 别忘了这个弟弟很穷。他只有一个i7 cpu。
他认为模型学得不够快,分数不够高,是几个因素造成的:一是因为用cpu学习总是掉线;第二,供这个ai玩的图像太小,只有40×20,可能会导致特征丢失,在目前的模型架构下会减慢学习速度。
如果换成gpu,也许吧...
不管相关链接的gpu会不会改进,都可以试试这段代码:
github . com/ravi 72 munde/chromedinoreinforc . com/acingai/howibuildanaitoplaydinorune 37 f 37 bdf 153
实际上还有一件事,让ai处理小恐龙和让ai处理flappy bird本质上是一样的。如果你想深入研究这个事情,这里还有两个。
机器学习玩flappy bird百科:从原理到代码六校
用神经网络遗传算法玩flappy bird |教程
就酱~
结束—
真诚招聘
量子比特正在招聘一名编辑/记者,工作地点在北京中关村。期待有才华有热情的同学加入我们!详情请回复word 招聘与招聘在官方账号的对话界面。
量子比特qbitai头条号签约作者
追踪人工智能技术和产品的新趋势
了解更多如何关闭谷歌浏览器中的恐龙游戏(谷歌chrome恐龙)相关内容请关注本站点。