ColaboratoryでKeras-rl+OpenAI Gym (classical_control)

google colaboratory上で,openAI GymClassic Controlを使って遊べることがわかったので,さらにKeras-RLを使ってDQL(Deep-Q Learning)を試してみた。colaboratoryはKerasをサポートしているので,あっけなくデモが動いてめでたし。

準備

必要なものをインストール。前の記事とほぼ同様だが,keras-rlも追加。また,今回はcolaboratory上にアニメーションは表示しないことにするので,pyvirtualdisplayはインストールしない。

!apt-get -qq -y install libcusparse8.0 libnvrtc8.0 libnvtoolsext1 > /dev/null
!ln -snf /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so.8.0 /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so

!apt-get -qq -y install xvfb freeglut3-dev ffmpeg> /dev/null
!pip install pyglet
!pip install pyopengl
!pip install gym[classic_control]
!pip install keras-rl

実行

Keras-rlにあるサンプルプログラム(dqn_cartpole.py)を利用。 ただし,前の記事に書いたようにGymのwrappersを使う方法で,動画保存をしている。ソースは以下の通り。元のサンプルプログラムにあった長いコメントは消してある。 実行前にはGPUアクセラレーションを有効にするのを忘れずに。Colaboratoryのメニュー「ランタイム/ランタイムのタイプを変更」で設定する。

import numpy as np
import gym

from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from keras.optimizers import Adam

from rl.agents.dqn import DQNAgent
from rl.policy import BoltzmannQPolicy
from rl.memory import SequentialMemory

from gym import wrappers # <=追加

ENV_NAME = 'CartPole-v0'

# Get the environment and extract the number of actions.
env = gym.make(ENV_NAME)
env = wrappers.Monitor(env, './', force=True)  # <=追加

np.random.seed(123)
env.seed(123)
nb_actions = env.action_space.n

# Next, we build a very simple model.
model = Sequential()
model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(nb_actions))
model.add(Activation('linear'))
print(model.summary())

memory = SequentialMemory(limit=50000, window_length=1)
policy = BoltzmannQPolicy()
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10,
               target_model_update=1e-2, policy=policy)
dqn.compile(Adam(lr=1e-3), metrics=['mae'])
dqn.fit(env, nb_steps=50000, visualize=True, verbose=2)
dqn.save_weights('dqn_{}_weights.h5f'.format(ENV_NAME), overwrite=True)

# Finally, evaluate our algorithm for 5 episodes.
# dqn.test(env, nb_episodes=5, visualize=True) # これはエラーが出るのでコメントに

最後の行は,エピソードのステップ数を調整すればエラーはなくなるはずだが,未対応。

結果

学習前

64エピソード後

216エピソード後

MuJoCoの楽しげな物理シミュレシーションで遊ぼうと,Keras-rlのデモ(ddpg_mujoco.py)を動かそうとしたが,そもそもMuJoCoの導入がうまくいかない。 MuJoCoはライセンスの問題とかもあるので,さっさとRoboschoolで試してみるか。

リンク