スポンサーリンク

GymnasiumでAtari Breakoutを動かす【Google Colab】

Google Colab

強化学習でなにか動作させてみたいと思い、まずはGymnasiumのAtari BreakoutをGoogle Colabで動作させてみます。Atari Breakoutは、以下のようなブロック崩しゲームです。

DQN強化学習で全クリアをした記事は以下になります。

Gymnasiumは、元々OpenAI が提供していた強化学習アルゴリズムのためのオープンスースライブラリGymを引き継いで、メンテナンスしているものです。※Gymライブラリ自体の更新は終了しています。

Atari Breakoutを動かす

ライブラリのインストール

GymnasiumのAtari環境をpipでインストールします。gymnasium全体をインストールすると膨大なため、atariのみを指定してインストールします。

!pip install gymnasium[atari]
!pip install gymnasium[accept-rom-license]

環境の作成

gymnasium.make()idに”ALE/Breakout-v5″を指定し、render_modeに”rgb_array”を指定します。idに他のゲーム名を入れることで、他のゲーム環境を作成することができます。またrender_modeに”human”を指定すると、音などがでますが、Google Colabでは動作しませんので、ここでは”rgb_array”を指定しました。

import gymnasium as gym

env = gym.make(id="ALE/Breakout-v5", render_mode="rgb_array")

env.reset()で環境を初期化、env.render()を使ってRGBのデータを取得し、plt.imshow()を使って描画します。Breakoutの環境が作成できていることが確認できました。

import matplotlib.pyplot as plt
%matplotlib inline

env.reset()
img = env.render()
print(type(img))
# <class 'numpy.ndarray'>
print(img.shape)
# (210, 160, 3)
plt.imshow(img)

env.step()によるアクション

env.step()を用いることで、ゲームを進めたり、パドル動かしたりすることができます。Breakoutでは4つのアクションが用意されており、env.step()の引数に指定することで動作させることができます。

NumAction
0NOOPなにもしない
1FIREballを出す
2RIGHTパドルを右へ動かす
3LEFTパドルを左へ動かす

例えば、env.step(1)env.step(2)env.step(2)のように実行するとballを出した後に、パドル右に二度動かすことができます。

from IPython import display

plt.imshow(env.render())
display.display(plt.gcf())
env.step(1)
plt.imshow(env.render())
display.display(plt.gcf())
env.step(2)
plt.imshow(env.render())
display.display(plt.gcf())
env.step(2)
plt.imshow(env.render())

env.step()の返り値

env.step()では、ゲームを進めた後の環境の情報を返り値として得ることができます。Breakoutでの基本的な返り値は以下です。

  • observation:ゲームのRGB 画像 numpy.ndarray (210, 160, 3)
  • reward:アクションに対する報酬 Float

通常は0で、ブロックを破壊するとポイントが返ってきます。(赤 – 7 ポイント オレンジ – 7 ポイント 黄 – 4 ポイント 緑 – 4 ポイント  水色 – 1 ポイント 青 – 1 ポイント)

  • terminated:終了状態 bool

ライフが0になるか、すべてのブロックを破壊するとTrueが返ってきます。通常はFalseです。

  • truncated:途中終了 bool

時間制限がある場合、時間切れ時にTrueが返ってきます。通常はFalseです。

  • info:種々の補助的な情報 dict
observation, reward, terminated, truncated, info = env.step(0)
print(f'reward:{reward}, terminated:{terminated}, truncated:{truncated}, info:{info}')
# reward:0.0, terminated:False, truncated:False, info:{'lives': 5, 'episode_frame_number': 16, 'frame_number': 16}

ランダムアクションでゲームを動かす

env.step()に0~4の範囲で乱数を与えてゲームを終了するまで実行します。

import random
import gymnasium as gym
from IPython import display
import matplotlib.pyplot as plt
%matplotlib inline

env = gym.make('ALE/Breakout-v5', render_mode="rgb_array")
env.reset()
for _ in range(1000):
    action = random.randint(0, 3)
    observation, reward, terminated, truncated, info = env.step(action)
    plt.imshow(observation)
    display.display(plt.gcf())
    print(f'reward:{reward}')
    display.clear_output(wait=True)

    if terminated or truncated:
        break

ランダムに動作させるだけでは、全然だめですね。とりあえず、Breakoutを動作させることは成功したので、強化学習の勉強を始めてまともに動作したらブログに投稿しようと思います。オススメの本などあれば教えていただけると嬉しいです。よろしくお願いします。

勉強予定の本

関連記事、参考資料

Machine Learning 記事一覧

Book 記事一覧

コメント