用 TensorFlow 訓(xùn)練 Doom 機(jī)器人
作者:Mark Litwintschik
本文地址:http://tech.marksblogg.com/tensorflow-vizdoom-bots.html
ViZDoom 是一個(gè) AI 研究平臺(tái)兼蕊,允許你訓(xùn)練機(jī)器人來(lái)玩 Doom结笨,這是 1993 年最初由 id Software 發(fā)布的經(jīng)典第一人稱視角射擊游戲沸毁。ViZDoom 使用一款開(kāi)源 Doom 引擎 ZDoom 與游戲進(jìn)行交互。
ViZDoom 包含了一系列用 C ++,Java和敬,Lua 和 Python 編寫(xiě)的示例機(jī)器人。在許多情況下,模型本身依賴于各種潛在的深度學(xué)習(xí)庫(kù)月幌,如 TensorFlow 和 Theano。
使用 ViZDoom悬蔽,機(jī)器人將針對(duì)場(chǎng)景進(jìn)行訓(xùn)練扯躺。ViZDoom 在發(fā)布源代碼中包含幾種場(chǎng)景。場(chǎng)景定義了 Doom 地圖,機(jī)器人可用的控件(如左轉(zhuǎn)录语,攻擊等)倍啥,玩家模式和技能水平。
在這篇博文中澎埠,我將通過(guò)設(shè)置 ViZDoom 和 TensorFlow虽缕,并訓(xùn)練機(jī)器人在 Doom 中扮演惡魔。
ViZDoom 啟動(dòng)運(yùn)行
以下是在全新安裝的 Ubuntu Desktop 14.04.4 上運(yùn)行蒲稳。通常我使用了分布式服務(wù)器氮趋,但是我想看到機(jī)器人在完成訓(xùn)練后玩游戲。
我將使用 Google 的深度學(xué)習(xí)框架 TensorFlow 進(jìn)行機(jī)器人培訓(xùn)江耀。為了方便起見(jiàn)剩胁,我將描述如何使用 CPU 運(yùn)行所有內(nèi)容,但是如果要使用 GPU 進(jìn)行訓(xùn)練决记,那么請(qǐng)進(jìn)一步了解參閱基于 GTX 1080 的 TensorFlow 博客摧冀,以 GPU 為中心的安裝說(shuō)明。在許多情況下系宫,TensorFlow 將在 GPU 上比常規(guī)桌面 CPU 快一至二個(gè)數(shù)量級(jí)索昂。
我正在使用的機(jī)器配置 Intel Core i5 4670K,頻率為 3.4 GHz扩借,32 GB DDR3 內(nèi)存椒惨,SanDisk SDSSDHII960G 960 GB SSD 驅(qū)動(dòng)器和 Nvidia GeForce GTX 1080 顯卡。
首先潮罪,我將安裝各種包依賴康谆。
$ sudo apt-get update
$ sudo apt-get install \
build-essential \
cmake \
gfortran \
git \
libatlas-base-dev \
libblas-dev \
libboost-all-dev \
libbz2-dev \
libfluidsynth-dev \
libgme-dev \
libgtk2.0-dev \
libjpeg-dev \
liblapack-dev \
liblua5.1-dev \
libopenal-dev \
libsdl2-dev \
libwildmidi-dev \
nasm \
openjdk-7-jdk \
python-dev \
python-pip \
python-virtualenv \
tar \
timidity \
zlib1g-dev
然后我將設(shè)置 Java 的主文件夾。
$ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
ViZDoom 是用 Python 編寫(xiě)的嫉到,所以我將創(chuàng)建一個(gè)虛擬環(huán)境并激活它沃暗。
$ virtualenv vz
$ source vz / bin / activate
然后我將安裝五個(gè)基于 Python 的依賴。其中包括 TensorFlow 的分布式 CPU 驅(qū)動(dòng)的 wheel何恶。如果要使用 CUDA 支持的 GPU 加速版本孽锥,有一個(gè)單獨(dú)的分布式。
$ pip install \
cython \
numpy
$ pip install \
scikit-image \
https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.0-cp27-none-linux_x86_64.whl \
tqdm
然后细层,我將克隆 ViZDoom git 存儲(chǔ)庫(kù)惜辑,構(gòu)建 Python 模塊并進(jìn)行安裝。
$ git clone https://github.com/mwydmuch/ViZDoom.git
$ cd ViZDoom
$ cmake -DCMAKE_BUILD_TYPE=Release \
-DBUILD_PYTHON=ON \
-DBUILD_JAVA=ON \
-DBUILD_LUA=ON
$ make
$ pip install.
基于 TensorFlow 的模型通常與 CPU 和 GPU 無(wú)關(guān)疫赎,但如果你使用 CPU 驅(qū)動(dòng)的分布式 TensorFlow 進(jìn)行訓(xùn)練盛撑,則可能會(huì)看到警告:所使用的 wheel 沒(méi)有為你的 CPU 進(jìn)行優(yōu)化編譯。如果你正在運(yùn)行第四代或更高版本的 Intel Core i5 CPU捧搞,則將缺乏對(duì) SSE3抵卫,SSE4.1狮荔,SSE4.2,AVX 和 FMA 指令的支持陌僵。
訓(xùn)練 Doom 機(jī)器人
有一個(gè)示例模型 「learning_tensorflow.py」 位于 examples/python 文件夾中轴合,該文件夾將加載機(jī)器人在空房間的場(chǎng)景创坞,一個(gè)敵人在另一端碗短。機(jī)器人有能力左右移動(dòng)攻擊。機(jī)器人基于在比賽時(shí)間結(jié)束之前能夠快速殺死對(duì)手的得分题涨。
以下是此方案的配置文件:
$ cat scenarios/simpler_basic.cfg
doom_scenario_path = simpler_basic.wad
# Rewards
living_reward = -1
# Rendering options
screen_resolution = RES_640X480
screen_format = GRAY8
render_hud = true
render_crosshair = false
render_weapon = true
render_decals = false
render_particles = false
# make episodes start after 20 tics (after unholstering the gun)
episode_start_time = 14
# make episodes finish after 300 actions (tics)
episode_timeout = 300
# Available buttons
available_buttons =
{
MOVE_LEFT
MOVE_RIGHT
ATTACK
}
下面花了 14 分鐘訓(xùn)練機(jī)器人偎谁。
$ cd examples/python
$ python learning_tensorflow.py
一旦訓(xùn)練完成,底層的開(kāi)源 Doom 引擎 ZDoom 開(kāi)始并且可以看到機(jī)器人在 10 局不同的游戲中對(duì)付敵人纲堵。
機(jī)器人每回合擁有 50 發(fā)彈藥巡雨,并給予 300 個(gè)游戲動(dòng)作來(lái)殺死單個(gè)惡魔。在這種情況下席函,惡魔并沒(méi)有反抗铐望,也沒(méi)有太大的動(dòng)作。不幸的是茂附,即使有這么好的設(shè)置正蛙,在超過(guò) 20% 的游戲中,機(jī)器人很少殺死惡魔营曼。以下是10場(chǎng)比賽的得分乒验。
Total score: -404.0
Total score: -404.0
Total score: -404.0
Total score: -404.0
Total score: -404.0
Total score: -404.0
Total score: 56.0
Total score: -404.0
Total score: -1.0
Total score: -404.0
保衛(wèi)中心
ViZDoom 附帶的其他場(chǎng)景是「保衛(wèi)中心」場(chǎng)景,其中機(jī)器人在一個(gè)競(jìng)技場(chǎng)中是靜止的蒂阱,只允許左右轉(zhuǎn)動(dòng)并進(jìn)行攻擊锻全。有一列的敵人會(huì)穩(wěn)定地接近機(jī)器人,在敵人攻擊之前有時(shí)間殺死他們录煤。ViZDoom 的主要開(kāi)發(fā)者之一鳄厌,Micha? Kempka 上傳了這種情況下視頻的到 YouTube。
在我的 GTX 1080 上使用 GPU 加速 TensorFlow 分布式來(lái)訓(xùn)練機(jī)器人之前妈踊,我修改了以下五行代碼的示例 /python/ learning_tensorflow.py了嚎。訓(xùn)練了41分鐘才能完成。
learning_rate = 0.002
epochs = 5
learning_steps_per_epoch = 4000
test_episodes_per_epoch = 1000
config_file_path = "../../scenarios/defend_the_center.cfg"
每殺死一個(gè)敵人响委,機(jī)器人獲得一分新思,并且如果死亡,它會(huì)失去一分赘风。每輪有 26 發(fā)彈藥夹囚。在這過(guò)程中,我注意到機(jī)器人開(kāi)始非常亂開(kāi)槍邀窃,它的彈藥庫(kù)消耗有一點(diǎn)太快荸哟,遺漏一些惡魔假哎。它值得在射擊時(shí)瞄準(zhǔn)目標(biāo)。
十次運(yùn)行后鞍历,機(jī)器人死亡前平均每場(chǎng)殺死 5.9 名惡魔舵抹,
Total score: 5.0
Total score: 3.0
Total score: 5.0
Total score: 5.0
Total score: 4.0
Total score: 5.0
Total score: 6.0
Total score: 5.0
Total score: 7.0
Total score: 4.0