強化学習/ColaboratoryでOpenAI Gymを使う
をテンプレートにして作成
開始行:
*はじめに [#a650c2e4]
ColaboratoryはGoogleが提供している無料で使えるJupyter Not...
TensorFlow用のプロセッサーTPUが使えるので、深層学習もでき...
ここでは、Colaboratory上でOpenAIが提供する強化学習ライブ...
OpenAIが用意している強化学習アルゴリズムのライブラリーのB...
次の環境で確認しました。
-TensorFlow-GPU 1.15
-OpenAI Gym 0.15.3
-Stable Baselines 2.2.1
*環境構築 [#md8713d5]
#geshi(python){{
!apt-get -y -q install cuda-libraries-dev-10-0 > /dev/null
!apt-get -y -q install xvfb freeglut3-dev ffmpeg > /dev/n...
!npm install -g localtunnel
!pip install pyglet
!pip install pyopengl
!pip install pyvirtualdisplay
!pip install tensorflow-gpu==1.15
!pip install gym
!pip install stable-baselines
}}
*関数 [#za2a5d54]
**100エピソードの平均ステップ数を評価する関数(CartPole用...
#geshi(python){{
def evaluate(env_name, model, num_steps=1000):
episode_rewards = [0.0]
local_env = gym.make(env_name)
obs = local_env.reset()
for i in range(num_steps):
# _states are only useful when using LSTM policies
action, _states = model.predict(obs)
obs, reward, done, info = local_env.step(action)
# Stats
episode_rewards[-1] += reward
if done:
obs = local_env.reset()
episode_rewards.append(0.0)
# Compute mean reward for the last 100 episodes
mean_100ep_reward = round(np.mean(episode_rewards[-100:...
print("Mean reward:", mean_100ep_reward, "Num episodes:...
return mean_100ep_reward
}}
**1エピソード実行する様子を画面に出力する関数 [#acb7db33]
#geshi(python){{
def show(env_name, model, num_steps=1000):
local_env = gym.make(env_name)
obs = local_env.reset()
for step in range(num_steps):
plt.imshow(local_env.render(mode='rgb_array'))
display.clear_output(wait=True)
display.display(plt.gcf())
# _states are only useful when using LSTM policies
action, _states = model.predict(obs)
obs, reward, done, info = local_env.step(action)
if done:
local_env.close()
break
print('Num steps:', step)
return step
}}
**1エピソード実行する様子を動画に記録する関数 [#d3d679b3]
#geshi(python){{
def record(env_name, model, num_steps=1000):
from gym import wrappers
local_env = gym.make(env_name)
wrap_env = wrappers.Monitor(local_env, './', force=True)
obs = wrap_env.reset()
for step in range(num_steps):
# _states are only useful when using LSTM policies
action, _states = model.predict(obs)
obs, reward, done, info = wrap_env.step(action)
if done:
wrap_env.close()
break
print('Num steps:', step)
return step
}}
**動画ファイルをダウンロードする関数 [#ld59022b]
#geshi(python){{
def download():
from google.colab import files
import glob
for file in glob.glob('openaigym.video.*.mp4'):
files.download(file)
}}
*ここからメイン [#ce94ea16]
#geshi(python){{
%tensorflow_version 1.x
import os
import gym
import numpy as np
from stable_baselines.common.policies import MlpPolicy, C...
from stable_baselines.common.vec_env import DummyVecEnv
from stable_baselines import PPO2
# TensorBoard用ログ
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)
# ディスプレイ
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()
import os
os.environ["DISPLAY"] = ":" + str(display.display) + "." ...
from IPython import display
import matplotlib.pyplot as plt
%matplotlib inline
# 環境
#env_name = 'MsPacman-v0'
env_name = 'CartPole-v0'
ori_env = gym.make(env_name)
# vectorized environments allow to easily multiprocess tr...
# we demonstrate its usefulness in the next examples
env = DummyVecEnv([lambda: ori_env]) # The algorithms re...
# PPO2エージェント
model = PPO2(MlpPolicy, env, verbose=1, tensorboard_log=...
#model = PPO2(CnnPolicy, env, verbose=1, tensorboard_log...
}}
#geshi(python){{
# 保存されたエージェントを読み込む(2回目以後)
#model = PPO2.load('model')
#model.set_env(env)
}}
#geshi(python){{
# 学習前のエージェントを評価する(CartPole用)
mean_reward_before_train = evaluate(env_name, model, num_...
}}
#geshi(python){{
# 学習前のランダムに動くエージェントの動きを確認する(デ...
show(env_name, model, num_steps=1000)
}}
#ref(./cartpole.png,nolink)
#geshi(python){{
# 学習前のランダムに動くエージェントを動画に記録する
num_steps = record(env_name, model, num_steps=10000)
# 動画を記録するのに時間がかかるので少し待つ
!sleep 10
}}
#geshi(python){{
# 動画ファイルをダウンロードする
download()
}}
ダウンロードに失敗する場合は、まだファイルができていない...
このセルをもう一度実行すると、ダウンロードできることがあ...
#geshi(python){{
# エージェントに学習させる
model.learn(total_timesteps=100000)
}}
TensorFlowが実行される度に、次のようなログが出力されます。
--------------------------------------
| approxkl | 4.4409087e-05 |
| clipfrac | 0.0 |
| ep_rewmean | nan |
| eplenmean | nan |
| explained_variance | 0.245 |
| fps | 806 |
| nupdates | 782 |
| policy_entropy | 0.52703226 |
| policy_loss | 0.00044246577 |
| serial_timesteps | 100096 |
| time_elapsed | 128 |
| total_timesteps | 100096 |
| value_loss | 3.9141965 |
--------------------------------------
必要ない場合は、エージェントを生成するときのverboseを0に...
#geshi(python){{
# 学習後のエージェントを評価する(CartPole用)
mean_reward = evaluate(env_name, model, num_steps=10000)
}}
#geshi(python){{
# 学習後のエージェントの動きを確認する(デバッグ用)
show(env_name, model, num_steps=1000)
}}
#ref(./cartpole.png,nolink)
#geshi(python){{
# 学習後のランダムに動くエージェントを動画に記録する
num_steps = record(env_name, model, num_steps=10000)
# 動画を記録するのに時間がかかるので少し待つ
!sleep 10
}}
#geshi(python){{
# 動画ファイルをダウンロードする
download()
}}
#geshi(python){{
# 学習したエージェントをファイルに保存する
model.save('model')
# エージェントを削除する(デバッグ用)
#del model
}}
*TensorBoard [#q851f04d]
#geshi(python){{
# TensorBoardとLocalTunnelを起動する
get_ipython().system_raw('tensorboard --logdir {} --host ...
get_ipython().system_raw('lt --port 6006 > url.txt 2>&1 &')
# TensorBoardが起動するの時間がかかるので少し待つ
!sleep 10
}}
#geshi(python){{
# 次で出力されるURLにアクセス(ランタイムを再起動すると無...
!cat url.txt
}}
学習のログをTensorBoardで確認できます。
#ref(./tensorboard.png,nolink,50%)
*参考にした資料 [#h8b55a7d]
***OpenAI Gym on Colaboratory [#leae03ba]
- [[Jun Nishi: ColaboratoryでOpenAI gym:http://bcl.sci.ya...
- [[@enmaru: Google Colaboratoryの90分セッション切れ対策...
***Stable-Baelines [#w8622bd0]
- [[Stable Baselines, a Fork of OpenAI Baselines - Gettin...
-[[Stable Baselines入門 / エージェントの保存と読み込み - ...
***TensorBoard on Colaboratoey [#w7de60fe]
- [[@kazuyakitahara: Google Colabratory 上でTensorBoardを...
- [[npaka: Stable Baselines入門 / 学習の監視 - note:https...
終了行:
*はじめに [#a650c2e4]
ColaboratoryはGoogleが提供している無料で使えるJupyter Not...
TensorFlow用のプロセッサーTPUが使えるので、深層学習もでき...
ここでは、Colaboratory上でOpenAIが提供する強化学習ライブ...
OpenAIが用意している強化学習アルゴリズムのライブラリーのB...
次の環境で確認しました。
-TensorFlow-GPU 1.15
-OpenAI Gym 0.15.3
-Stable Baselines 2.2.1
*環境構築 [#md8713d5]
#geshi(python){{
!apt-get -y -q install cuda-libraries-dev-10-0 > /dev/null
!apt-get -y -q install xvfb freeglut3-dev ffmpeg > /dev/n...
!npm install -g localtunnel
!pip install pyglet
!pip install pyopengl
!pip install pyvirtualdisplay
!pip install tensorflow-gpu==1.15
!pip install gym
!pip install stable-baselines
}}
*関数 [#za2a5d54]
**100エピソードの平均ステップ数を評価する関数(CartPole用...
#geshi(python){{
def evaluate(env_name, model, num_steps=1000):
episode_rewards = [0.0]
local_env = gym.make(env_name)
obs = local_env.reset()
for i in range(num_steps):
# _states are only useful when using LSTM policies
action, _states = model.predict(obs)
obs, reward, done, info = local_env.step(action)
# Stats
episode_rewards[-1] += reward
if done:
obs = local_env.reset()
episode_rewards.append(0.0)
# Compute mean reward for the last 100 episodes
mean_100ep_reward = round(np.mean(episode_rewards[-100:...
print("Mean reward:", mean_100ep_reward, "Num episodes:...
return mean_100ep_reward
}}
**1エピソード実行する様子を画面に出力する関数 [#acb7db33]
#geshi(python){{
def show(env_name, model, num_steps=1000):
local_env = gym.make(env_name)
obs = local_env.reset()
for step in range(num_steps):
plt.imshow(local_env.render(mode='rgb_array'))
display.clear_output(wait=True)
display.display(plt.gcf())
# _states are only useful when using LSTM policies
action, _states = model.predict(obs)
obs, reward, done, info = local_env.step(action)
if done:
local_env.close()
break
print('Num steps:', step)
return step
}}
**1エピソード実行する様子を動画に記録する関数 [#d3d679b3]
#geshi(python){{
def record(env_name, model, num_steps=1000):
from gym import wrappers
local_env = gym.make(env_name)
wrap_env = wrappers.Monitor(local_env, './', force=True)
obs = wrap_env.reset()
for step in range(num_steps):
# _states are only useful when using LSTM policies
action, _states = model.predict(obs)
obs, reward, done, info = wrap_env.step(action)
if done:
wrap_env.close()
break
print('Num steps:', step)
return step
}}
**動画ファイルをダウンロードする関数 [#ld59022b]
#geshi(python){{
def download():
from google.colab import files
import glob
for file in glob.glob('openaigym.video.*.mp4'):
files.download(file)
}}
*ここからメイン [#ce94ea16]
#geshi(python){{
%tensorflow_version 1.x
import os
import gym
import numpy as np
from stable_baselines.common.policies import MlpPolicy, C...
from stable_baselines.common.vec_env import DummyVecEnv
from stable_baselines import PPO2
# TensorBoard用ログ
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)
# ディスプレイ
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()
import os
os.environ["DISPLAY"] = ":" + str(display.display) + "." ...
from IPython import display
import matplotlib.pyplot as plt
%matplotlib inline
# 環境
#env_name = 'MsPacman-v0'
env_name = 'CartPole-v0'
ori_env = gym.make(env_name)
# vectorized environments allow to easily multiprocess tr...
# we demonstrate its usefulness in the next examples
env = DummyVecEnv([lambda: ori_env]) # The algorithms re...
# PPO2エージェント
model = PPO2(MlpPolicy, env, verbose=1, tensorboard_log=...
#model = PPO2(CnnPolicy, env, verbose=1, tensorboard_log...
}}
#geshi(python){{
# 保存されたエージェントを読み込む(2回目以後)
#model = PPO2.load('model')
#model.set_env(env)
}}
#geshi(python){{
# 学習前のエージェントを評価する(CartPole用)
mean_reward_before_train = evaluate(env_name, model, num_...
}}
#geshi(python){{
# 学習前のランダムに動くエージェントの動きを確認する(デ...
show(env_name, model, num_steps=1000)
}}
#ref(./cartpole.png,nolink)
#geshi(python){{
# 学習前のランダムに動くエージェントを動画に記録する
num_steps = record(env_name, model, num_steps=10000)
# 動画を記録するのに時間がかかるので少し待つ
!sleep 10
}}
#geshi(python){{
# 動画ファイルをダウンロードする
download()
}}
ダウンロードに失敗する場合は、まだファイルができていない...
このセルをもう一度実行すると、ダウンロードできることがあ...
#geshi(python){{
# エージェントに学習させる
model.learn(total_timesteps=100000)
}}
TensorFlowが実行される度に、次のようなログが出力されます。
--------------------------------------
| approxkl | 4.4409087e-05 |
| clipfrac | 0.0 |
| ep_rewmean | nan |
| eplenmean | nan |
| explained_variance | 0.245 |
| fps | 806 |
| nupdates | 782 |
| policy_entropy | 0.52703226 |
| policy_loss | 0.00044246577 |
| serial_timesteps | 100096 |
| time_elapsed | 128 |
| total_timesteps | 100096 |
| value_loss | 3.9141965 |
--------------------------------------
必要ない場合は、エージェントを生成するときのverboseを0に...
#geshi(python){{
# 学習後のエージェントを評価する(CartPole用)
mean_reward = evaluate(env_name, model, num_steps=10000)
}}
#geshi(python){{
# 学習後のエージェントの動きを確認する(デバッグ用)
show(env_name, model, num_steps=1000)
}}
#ref(./cartpole.png,nolink)
#geshi(python){{
# 学習後のランダムに動くエージェントを動画に記録する
num_steps = record(env_name, model, num_steps=10000)
# 動画を記録するのに時間がかかるので少し待つ
!sleep 10
}}
#geshi(python){{
# 動画ファイルをダウンロードする
download()
}}
#geshi(python){{
# 学習したエージェントをファイルに保存する
model.save('model')
# エージェントを削除する(デバッグ用)
#del model
}}
*TensorBoard [#q851f04d]
#geshi(python){{
# TensorBoardとLocalTunnelを起動する
get_ipython().system_raw('tensorboard --logdir {} --host ...
get_ipython().system_raw('lt --port 6006 > url.txt 2>&1 &')
# TensorBoardが起動するの時間がかかるので少し待つ
!sleep 10
}}
#geshi(python){{
# 次で出力されるURLにアクセス(ランタイムを再起動すると無...
!cat url.txt
}}
学習のログをTensorBoardで確認できます。
#ref(./tensorboard.png,nolink,50%)
*参考にした資料 [#h8b55a7d]
***OpenAI Gym on Colaboratory [#leae03ba]
- [[Jun Nishi: ColaboratoryでOpenAI gym:http://bcl.sci.ya...
- [[@enmaru: Google Colaboratoryの90分セッション切れ対策...
***Stable-Baelines [#w8622bd0]
- [[Stable Baselines, a Fork of OpenAI Baselines - Gettin...
-[[Stable Baselines入門 / エージェントの保存と読み込み - ...
***TensorBoard on Colaboratoey [#w7de60fe]
- [[@kazuyakitahara: Google Colabratory 上でTensorBoardを...
- [[npaka: Stable Baselines入門 / 学習の監視 - note:https...
ページ名: