用 TensorFlow 训练 Doom 机器人

 

用 TensorFlow 训练 Doom 机器人

作者:Mark Litwintschik
本文地址:http://tech.marksblogg.com/tensorflow-vizdoom-bots.html

ViZDoom 是一个 AI 研究平台,允许你训练机器人来玩 Doom,这是 1993 年最初由 id Software 发布的经典第一人称视角射击游戏。ViZDoom 使用一款开源 Doom 引擎 ZDoom 与游戏进行交互。

ViZDoom 包含了一系列用 C ++,Java,Lua 和 Python 编写的示例机器人。在许多情况下,模型本身依赖于各种潜在的深度学习库,如 TensorFlowTheano

使用 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

 

由 Editor 于 2017 年 09 月 28 日 发布在 数据科学 栏目