为 TensorFlow 重塑 Gym 数组

Reshaping an Gym array for TensorFlow

我正在学习如何使用 Gym 环境来训练使用 TFLearn 构建的深度学习模型。

目前我的观察数组具有以下形状:(210, 160, 3)

关于重塑此数组以使其可用于 TensorFlow 分类模型的最佳方法有何建议?

标准方法(如 DeepMing 在 DQN paper 中所述)是:

  1. 将其转换为Gray-Scale,这样你就end-up有了(210,160)。在这里你最好检查没有有用的信息丢失,在某些游戏中可能会发生这种情况。 (例如,球变得与背景相同 'color')。在这里你可以使用类似的东西:

    processed = np.mean(frame,2,keepdims = False)

  2. 下采样到 (110,84)。您可以在这里使用 OpenCV 或任何其他方便的库:

    resized = cv2.resize(processed, (110,84),interpolation = cv2.CV_INTER_LINEAR)

  3. 裁剪屏幕的中心部分 (84,84)

    result = resized[13:97]

尽管 DeepMind 论文中对此进行了描述,但您可以使用更方便但仍然有效的程序,例如:

  1. 转换为灰度:

    processed = np.mean(frame,2,keepdims = False)

  2. 裁剪中心部分:

    cropped = processed[35:195]

  3. 下采样因子 2 得到 (80,80) 图像:

    result = cropped[::2,::2]

Andrej Karpathy 在他的 blog

中使用了类似的方法

您还可以使用其他维度大小,转换为二进制图像而不是 gray-scale 或任何更适合您的应用程序的图像。

处理完图像后,您可以将其提供给卷积网络或展平为一维数组并提供给 fully-connected 网络。

将多个帧(通常为 4 个)的堆栈与 skip-frames(拍摄一帧后跳过接下来的 3 帧)一起用作网络输入也很有用,因为它们通常不包含太多有用的内容信息。

请注意,Gym 本身有一个 AtariPreprocessing 包装器,您可以使用它来预处理 Atari 环境。我相信包装器所做的事情与 DQN 论文 asakryukin 中提到的类似。

你可以这样使用它:

import gym
from gym.wrappers import AtariPreprocessing

env = gym.make('Pong-v0')
env = AtariPreprocessing(env, frame_skip=1)

可以找到有关包装器的更多信息here