美文网首页我爱编程
用 TensorFlow 训练 Doom 机器人

用 TensorFlow 训练 Doom 机器人

作者: Datartisan数据工匠 | 来源:发表于2017-09-28 14:35 被阅读147次

    用 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
    

    相关文章

      网友评论

        本文标题:用 TensorFlow 训练 Doom 机器人

        本文链接:https://www.haomeiwen.com/subject/xpomextx.html