趙勇 張引瓊
摘要:本文主要介紹如何在Windows操作系統(tǒng)下,搭建使用TensorFlow,借助Unity機(jī)器學(xué)習(xí)代理工具,以3D平衡小球?yàn)槔?,讓板子上面的小球通過(guò)TensorFlow訓(xùn)練學(xué)習(xí),能夠自動(dòng)調(diào)節(jié)保持平衡不掉落,從而實(shí)現(xiàn)Unity3D機(jī)器學(xué)習(xí)工具的學(xué)習(xí)與應(yīng)用。
關(guān)鍵字:TensorFlow;unity;機(jī)器學(xué)習(xí)
中圖分類號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)23-0255-03
Abstract: This paper mainly introduces the method of setting up Tensorflow and its using in the Windows. Taking 3D balance ball as an example, let the ball learn to adjust itself automatically and keep the balance on the board through Tensorflows training, so as to implement the study and application of Unity3D machine learning tools.
Key words : TensorFlow Unity Machine learing
機(jī)器學(xué)習(xí)是專門(mén)研究計(jì)算機(jī)怎樣模擬或?qū)崿F(xiàn)人類的學(xué)習(xí)行為,以獲取新的知識(shí)或技能,重新組織已有的知識(shí)結(jié)構(gòu)使之不斷改善自身的性能。而TensorFlow是Google基于DistBelief進(jìn)行研發(fā)的新一代人工智能學(xué)習(xí)系統(tǒng),是一個(gè)采用數(shù)據(jù)流圖,用于數(shù)值計(jì)算的開(kāi)源軟件庫(kù)[1]。以其易用性、靈活性、高效性長(zhǎng)居Githubf 的fork and contribute榜首位,是當(dāng)前最熱門(mén)的機(jī)器學(xué)習(xí)框架。它通過(guò)構(gòu)建有向圖來(lái)描述所要執(zhí)行的操作,可以靈活的使用設(shè)備中的CPU或者GPU展開(kāi)計(jì)算,將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)傳輸至人工智能神經(jīng)網(wǎng)絡(luò)中進(jìn)行分析和處理。
Unity作為世界上最受歡迎的創(chuàng)作引擎,正處于機(jī)器學(xué)習(xí)與游戲的交匯點(diǎn),在過(guò)去代理要獲取我們所期待的行為需要人為編碼實(shí)現(xiàn),而現(xiàn)在則可以在訓(xùn)練環(huán)境中不斷的交互學(xué)習(xí)的方式教給代理,提高開(kāi)發(fā)效率。機(jī)器學(xué)習(xí)是一項(xiàng)顛覆性的技術(shù),而Unity中的機(jī)器學(xué)習(xí)則開(kāi)啟了人工智能史上的新篇章。
1 Windows下TensorFlow 平臺(tái)搭建
Google在2015年11月將TensorFlow開(kāi)源,初期只發(fā)行了在Linux和MAC系統(tǒng)下運(yùn)行的版本,在2016年年底Google才發(fā)行了Windows版本[2]。目前支持Python,c++等語(yǔ)言,考慮到Python語(yǔ)言的簡(jiǎn)潔性和與TensorFlow的無(wú)縫連接性,本文中所使用的語(yǔ)言為Python,同時(shí)我們使用GPU來(lái)加速計(jì)算。
1.1 安裝CUDA工具包
CUDA是NVIDIA推出的CUDA運(yùn)算平臺(tái)的工具集,CUDA提供了一個(gè)強(qiáng)大的開(kāi)發(fā)環(huán)境,
用于開(kāi)發(fā)高性能的GPU加速應(yīng)用。
1.2 安裝CUDA深度神經(jīng)網(wǎng)絡(luò)庫(kù)CUDNN
它是專門(mén)針對(duì)深度神經(jīng)網(wǎng)絡(luò)框架設(shè)計(jì)的一套GPU計(jì)算加速方案。全世界的深度學(xué)習(xí)研究者和框架開(kāi)發(fā)者都使用CUDNN來(lái)增強(qiáng)GPU計(jì)算性能。這專注于訓(xùn)練神經(jīng)網(wǎng)絡(luò)、開(kāi)發(fā)軟件應(yīng)用,不用在低級(jí)別的GPU性能調(diào)整上耗費(fèi)時(shí)間。
1.3 設(shè)置環(huán)境變量和路徑
進(jìn)入系統(tǒng)的環(huán)境變量窗口,點(diǎn)擊“新建”按鈕,添加新的系統(tǒng)變量CUDA_HOME,值為安裝CUDA的安裝路徑。
在環(huán)境變量窗口中系統(tǒng)變量的找到“路徑(Path)”,編輯環(huán)境變量窗口,將以下路徑添加進(jìn)入:
CUDA安裝路徑\lib\x64
CUDA安裝路徑\extras\CUPTI\libx64
如果電腦不支持CUP,則可直接省略掉部分。
1.4 安裝Anaconda,配置Python環(huán)境,下載TensorFlow
在Anaconda Prompt中輸入如下指令來(lái)創(chuàng)建環(huán)境:conda create -n tensorflow-gpu python=3.5.2
輸入如下指令啟動(dòng)剛剛創(chuàng)建的環(huán)境:activate tensorflow-gpu
指令安裝TensorFlow:pip install tensorflow-gpu
2 Unity3D機(jī)器學(xué)習(xí)
Unity3D是由Unity Technologies開(kāi)發(fā)的專業(yè)游戲引擎。它能夠讓游戲開(kāi)發(fā)者輕松創(chuàng)建
出2D游戲、3D游戲,以及實(shí)現(xiàn)建筑可視化、實(shí)時(shí)三維動(dòng)畫(huà),其具有強(qiáng)大的開(kāi)平臺(tái)性[3]。為了讓研究者提供強(qiáng)大的訓(xùn)練場(chǎng)景,將最新的機(jī)器學(xué)習(xí)技術(shù)與unity相結(jié)合,提高研發(fā)效率,Unity機(jī)器學(xué)習(xí)代理工具應(yīng)運(yùn)而生。
2.1 Unity機(jī)器學(xué)習(xí)代理
機(jī)器學(xué)習(xí)代理(ML-Agents)是一個(gè)開(kāi)源工具包,它幫助開(kāi)發(fā)和研究人員,將使用Unity
開(kāi)發(fā)的游戲及應(yīng)用程序轉(zhuǎn)換到可以對(duì)智能代理進(jìn)行培訓(xùn)的環(huán)境中。通過(guò)簡(jiǎn)單易用的Python API,運(yùn)用增強(qiáng)學(xué)習(xí)、進(jìn)化策略以及其他機(jī)器學(xué)習(xí)方法。機(jī)器學(xué)習(xí)代理對(duì)于高度逼真環(huán)境中的復(fù)雜機(jī)器學(xué)習(xí)問(wèn)題具有顯著的優(yōu)勢(shì)。[4]
使用此工具需在GitHub中https://github.com/Unity-Technologies/ml-agents下載unity
機(jī)器學(xué)習(xí)代理工具包
打開(kāi)Anaconda Prompt命令行,工作路徑切換到解壓文件的Python文件夾中,鍵入指令:conda install –force html5lib pip install .
當(dāng)上述步驟完成且無(wú)錯(cuò)誤出現(xiàn),則可開(kāi)始用TensorFlow來(lái)配置unity進(jìn)行機(jī)器學(xué)習(xí),
下面以Unity代理工具中的3D平衡小球?yàn)槔M(jìn)行說(shuō)明。
2.2 3D平衡小球
3D平衡小球項(xiàng)目是Unity機(jī)器學(xué)習(xí)代理工具中的事例環(huán)境項(xiàng)目。在說(shuō)明之前,先來(lái)解釋
一下一些術(shù)語(yǔ)。在學(xué)習(xí)過(guò)程中,動(dòng)作的執(zhí)行者稱之為代理,它內(nèi)嵌的環(huán)境中;策略則是值動(dòng)作執(zhí)行的最終目標(biāo),引導(dǎo)動(dòng)作的執(zhí)行;在動(dòng)作執(zhí)行前與執(zhí)行后都會(huì)有一個(gè)狀態(tài),兩個(gè)狀態(tài)的改變依據(jù)策略的標(biāo)準(zhǔn),獲得一個(gè)回報(bào)值。案例中的每一個(gè)平板即對(duì)應(yīng)一個(gè)代理,策略即讓木板保持小球的平衡,木板會(huì)根據(jù)策略的決策不斷執(zhí)行動(dòng)作來(lái)調(diào)整自己的狀態(tài),獲得更多的回報(bào)值,小球在平板上保持時(shí)間的長(zhǎng)短與回報(bào)值成正比。我們的目的就是通過(guò)相應(yīng)的機(jī)器學(xué)習(xí)算法來(lái)不斷訓(xùn)練,讓平板學(xué)會(huì)永遠(yuǎn)保持小球的平衡
3 訓(xùn)練過(guò)程實(shí)現(xiàn)
3.1 unity打開(kāi)項(xiàng)目場(chǎng)景
在Unity3D中將工具包中的unity-environment文件夾導(dǎo)入。在Project窗口的Assets/ML-Agents/Examples/3DBall/文件夾雙擊Scene文件,加載環(huán)境資源。
點(diǎn)擊play按鈕運(yùn)行場(chǎng)景。球在平板上無(wú)法保持平衡,很快掉落
3.2 導(dǎo)出用于訓(xùn)練的可執(zhí)行文件
為能夠?qū)С隹捎?xùn)練的模型,需要在Player Settings中做導(dǎo)出設(shè)置:
1) 點(diǎn)擊菜單Edit -> Project Settings -> Player,選中Resolution and Presentation里的Run in Background屬性,讓訓(xùn)練窗口失去焦點(diǎn)時(shí)不停止運(yùn)行,。將Resolution and Presentation中的Display Resolution Dialog屬性,選擇Disabled,訓(xùn)練窗口啟動(dòng)時(shí)不顯示分辨率對(duì)話框,如圖2。
2) 在左邊的場(chǎng)景層級(jí)窗口中,選中Ball3DAcademy游戲?qū)ο蟮淖訉?duì)象Brain3DBrain,在右邊的檢視窗口(Inspector)中將改對(duì)象的Brain type屬性值從player改為External。此時(shí)改項(xiàng)目將不能在unity中運(yùn)行,但卻能夠由代碼控制在外部運(yùn)行,如圖3。
3)點(diǎn)擊File -> Build Settings,選擇構(gòu)建運(yùn)行目標(biāo)平臺(tái),點(diǎn)擊build生成可執(zhí)行文件保存到代理工具的Python文件夾中。同時(shí)也勾選Development Build來(lái)記錄調(diào)試信息。
3.3訓(xùn)練模型
為訓(xùn)練代理,采用近端策略優(yōu)化,簡(jiǎn)稱PPO的強(qiáng)化學(xué)習(xí)算法來(lái)讓木板學(xué)習(xí)保持小球平衡。此算法進(jìn)過(guò)多次的實(shí)驗(yàn)檢測(cè),表明相對(duì)于其他算算法,是更安全、高效且實(shí)用性更強(qiáng),選擇此算法來(lái)說(shuō)明unity機(jī)器學(xué)習(xí)是最合適的。本文主要說(shuō)明的是如何在Unity中實(shí)現(xiàn)機(jī)器學(xué)習(xí),在此對(duì)于算法的實(shí)現(xiàn)并做過(guò)多的解釋。
啟動(dòng)Jupyter,在Jupyter中打開(kāi)python/PPO.ipynb,修改代碼中env_name變量的值為生成的環(huán)境文件的名字,按照自己的需求修改run_path變量的值,運(yùn)行代碼。在unity中生成的環(huán)境文件會(huì)自動(dòng)打開(kāi)訓(xùn)練窗口,由下圖可看到木板在不斷調(diào)整學(xué)習(xí)如何保持小球平衡。
為更好地觀察訓(xùn)練過(guò)程,命令行中鍵入 tensorboard --logdir=‘匯總數(shù)據(jù)保存路徑在瀏覽器中輸入localhost:6006打開(kāi)tensorboard查看數(shù)值的變化。同時(shí),在Jupty中會(huì)將訓(xùn)練迭代的次數(shù)和平均回報(bào)值(mean reward)打印出來(lái),每迭代50000次,則會(huì)自動(dòng)保存一次所訓(xùn)練學(xué)習(xí)得到的數(shù)據(jù),當(dāng)平均回報(bào)值達(dá)到70以上則可以停止訓(xùn)練。
3.4 導(dǎo)入模型查看結(jié)果
現(xiàn)在已有訓(xùn)練好的TensorFlow模型。但保存的模型不是Unity可使用的格式,需要通過(guò)轉(zhuǎn)化之后方可載入到Unity項(xiàng)目中運(yùn)行使用。
1) 下載TensorFlowsharp,雙擊打開(kāi)導(dǎo)入到unity中;菜單選擇Edit -> Project Settings -> Player,在Other Settings;的Scripting Runtime Version屬性中選擇Experimental (.NET 4.6 Equivalent);在Scripting Defined Symbols屬性中,加入ENABLE_TENSORFLOW;
2) 為了將訓(xùn)練結(jié)果保存為unity可識(shí)別的二進(jìn)制文件,需運(yùn)行代碼 export_graph(model_path, env_name) 生成一個(gè)
3) 打開(kāi)Unity,選擇3DBall場(chǎng)景;在層級(jí)窗口選擇Ball3DBrain對(duì)象,將Type of Brain屬性的值由External改為Internal;
4) 將二進(jìn)制文件從項(xiàng)目窗口拖到3DBallBrain 檢視窗口的Graph Model中,因?yàn)?DBall是個(gè)持續(xù)的控制環(huán)境,而TensorFlow模型會(huì)用噪音參數(shù)來(lái)決定行動(dòng),所以要將Graph Placeholder的size值設(shè)為1,添加名為epsilon的占位符,設(shè)定類型為floating point,范圍從0到0;
5) 點(diǎn)擊編輯器上方的Play按鈕,現(xiàn)在可以看到在Unity中,訓(xùn)練好的模型已經(jīng)能自行控制平衡小球的行為。
4 結(jié)束語(yǔ)
Windows是大多數(shù)人說(shuō)熟知的操作系統(tǒng),其直觀的圖形化界面使得操作起來(lái)簡(jiǎn)潔;Google開(kāi)源TensorFlow深度學(xué)習(xí)框架也是便利開(kāi)發(fā)人員,提供了構(gòu)建神經(jīng)網(wǎng)絡(luò)的接口,便于構(gòu)建BP神經(jīng)網(wǎng)絡(luò),簡(jiǎn)化編程任務(wù);Unity機(jī)器學(xué)習(xí)代理工具幫助研究開(kāi)發(fā)人員在復(fù)雜的學(xué)習(xí)場(chǎng)景中有效的訓(xùn)練代理;在Windows平臺(tái)下,使用TensorFlow機(jī)器學(xué)習(xí)框架,借助Unity機(jī)器學(xué)習(xí)代理工具,大大提高了開(kāi)發(fā)效率,在unity中搭建好環(huán)境,導(dǎo)出要訓(xùn)練的可執(zhí)行文件,編寫(xiě)好訓(xùn)練算法進(jìn)行訓(xùn)練,將訓(xùn)練好的模型格式轉(zhuǎn)化再次導(dǎo)入到unity中完成整個(gè)開(kāi)發(fā)流程。但目前TensorFlow和Unity機(jī)器學(xué)習(xí)代理工具還處在完善階段,相信在不久的將來(lái),兩者的完善結(jié)合能夠?yàn)榕鲎渤龈蛹ち业幕鸹ā?/p>
參考文獻(xiàn):
[1] 張敏敏,徐和平,王曉潔,等.谷歌TensorFlow機(jī)器學(xué)習(xí)框架及應(yīng)用[J].微型機(jī)與應(yīng)用,2017,26(10):58-60.
[2] Sam Abrahams,Danijar,Hafner,Erik,Erwitt,Ariel Scarpinelli.段菲,陳澎,譯.面向機(jī)器智能的TensorFlow實(shí)踐[M].機(jī)械工業(yè)出版社,2017.4.
[3] 吳亞峰,杜化美,于復(fù)興.unity游戲開(kāi)發(fā)案例大全[M].人民郵電出版社,2015.
[4] unity官方中文論壇.Unity推出機(jī)器學(xué)習(xí)代理工具,Unity引擎揭開(kāi)人工智能新篇章[EB/OL].http://forum.china.unity3d.com/thread-27736-1-1.html.
【通聯(lián)編輯:唐一東】