強化学習でなにか動作させてみたいと思い、まずは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()の引数に指定することで動作させることができます。
Num | Action | |
---|---|---|
0 | NOOP | なにもしない |
1 | FIRE | ballを出す |
2 | RIGHT | パドルを右へ動かす |
3 | LEFT | パドルを左へ動かす |
例えば、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を動作させることは成功したので、強化学習の勉強を始めてまともに動作したらブログに投稿しようと思います。オススメの本などあれば教えていただけると嬉しいです。よろしくお願いします。
コメント