ViZDoom 是一个 AI 研究平台,允许你训练机器人来玩 Doom,这是 1993 年最初由 id Software 发布的经典第一人称视角射击游戏。ViZDoom 使用一款开源 Doom 引擎 ZDoom 与游戏进行交互。
ViZDoom 包含了一系列用 C ++,Java,Lua 和 Python 编写的示例机器人。在许多情况下,模型本身依赖于各种潜在的深度学习库,如 TensorFlow 和 Theano。
使用 ViZDoom,机器人将针对场景进行训练。ViZDoom 在发布源代码中包含几种场景。场景定义了 Doom 地图,机器人可用的控件(如左转,攻击等),玩家模式和技能水平。
在这篇博文中,我将通过设置 ViZDoom 和 TensorFlow,并训练机器人在 Doom 中扮演恶魔。
ViZDoom 启动运行
以下是在全新安装的 Ubuntu Desktop 14.04.4 上运行。通常我使用了分布式服务器,但是我想看到机器人在完成训练后玩游戏。
我将使用 Google 的深度学习框架 TensorFlow 进行机器人培训。为了方便起见,我将描述如何使用 CPU 运行所有内容,但是如果要使用 GPU 进行训练,那么请进一步了解参阅基于 GTX 1080 的 TensorFlow 博客,以 GPU 为中心的安装说明。在许多情况下,TensorFlow 将在 GPU 上比常规桌面 CPU 快一至二个数量级。
我正在使用的机器配置 Intel Core i5 4670K,频率为 3.4 GHz,32 GB DDR3 内存,SanDisk SDSSDHII960G 960 GB SSD 驱动器和 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
然后我将设置 Java 的主文件夹。
$ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
ViZDoom 是用 Python 编写的,所以我将创建一个虚拟环境并激活它。
$ virtualenv vz
$ source vz / bin / activate
然后我将安装五个基于 Python 的依赖。其中包括 TensorFlow 的分布式 CPU 驱动的 wheel。如果要使用 CUDA 支持的 GPU 加速版本,有一个单独的分布式。
$ 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 存储库,构建 Python 模块并进行安装。
$ 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 无关,但如果你使用 CPU 驱动的分布式 TensorFlow 进行训练,则可能会看到警告:所使用的 wheel 没有为你的 CPU 进行优化编译。如果你正在运行第四代或更高版本的 Intel Core i5 CPU,则将缺乏对 SSE3,SSE4.1,SSE4.2,AVX 和 FMA 指令的支持。
训练 Doom 机器人
有一个示例模型 「learning_tensorflow.py」 位于 examples/python 文件夹中,该文件夹将加载机器人在空房间的场景,一个敌人在另一端。机器人有能力左右移动攻击。机器人基于在比赛时间结束之前能够快速杀死对手的得分。
以下是此方案的配置文件:
$ 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 分钟训练机器人。
$ cd examples/python
$ python learning_tensorflow.py
一旦训练完成,底层的开源 Doom 引擎 ZDoom 开始并且可以看到机器人在 10 局不同的游戏中对付敌人。
机器人每回合拥有 50 发弹药,并给予 300 个游戏动作来杀死单个恶魔。在这种情况下,恶魔并没有反抗,也没有太大的动作。不幸的是,即使有这么好的设置,在超过 20% 的游戏中,机器人很少杀死恶魔。以下是10场比赛的得分。
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
保卫中心
ViZDoom 附带的其他场景是「保卫中心」场景,其中机器人在一个竞技场中是静止的,只允许左右转动并进行攻击。有一列的敌人会稳定地接近机器人,在敌人攻击之前有时间杀死他们。ViZDoom 的主要开发者之一,Micha Kempka 上传了这种情况下视频的到 YouTube。
在我的 GTX 1080 上使用 GPU 加速 TensorFlow 分布式来训练机器人之前,我修改了以下五行代码的示例 /python/ learning_tensorflow.py。训练了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"
每杀死一个敌人,机器人获得一分,并且如果死亡,它会失去一分。每轮有 26 发弹药。在这过程中,我注意到机器人开始非常乱开枪,它的弹药库消耗有一点太快,遗漏一些恶魔。它值得在射击时瞄准目标。
十次运行后,机器人死亡前平均每场杀死 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
作者:Mark Litwintschik
本文地址:http://tech.marksblogg.com/tensorflow-vizdoom-bots.html
本文为专栏文章,来自:数据工匠,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/48323.html 。