ColaboratoryでKeras-rl+OpenAI Gym (classical_control)
google colaboratory上で,openAI GymのClassic 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で試してみるか。