前回収集した人間のデモ操作データを使って事前学習を行います。
環境設定に関しては、前回の記事(模倣学習② 人間のデモを使って事前学習を行う) を参照して下さい。
(Ubuntu 19.10で動作確認しています。)
模倣学習
人間のデモ操作データであるbowling_demo.npzファイル とrecorded_imagesフォルダ を使って模倣学習を行うコードは以下の通りです。
[コード]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import gym import time from stable_baselines import PPO2 from stable_baselines.common.vec_env import DummyVecEnv from stable_baselines.gail import ExpertDataset, generate_expert_traj from baselines.common.atari_wrappers import * # 環境の生成 env = gym.make('BowlingNoFrameskip-v0') env = MaxAndSkipEnv(env, skip=4) # 4フレームごとに行動を選択 env = WarpFrame(env) # 画面イメージを84x84のグレースケールに変換 env = DummyVecEnv([lambda: env]) # デモデータの読み込み dataset = ExpertDataset(expert_path='bowling_demo.npz',verbose=1) # モデルの生成 model = PPO2('CnnPolicy', env, verbose=1) # モデルの読み込み # model = PPO2.load('bowling_model', env=env) # モデルの事前訓練 model.pretrain(dataset, n_epochs=1000) # モデルの学習 # model.learn(total_timesteps=256000) # モデルの保存 model.save('bowling_model') # モデルのテスト state = env.reset() total_reward = 0 while True: env.render() # 環境の描画 time.sleep(1/60) # スリープ action, _ = model.predict(state) # モデルの推論 state, reward, done, info = env.step(action) # 1ステップ実行 total_reward += reward[0] if done: print('reward:', total_reward) state = env.reset() total_reward = 0
人間の操作したデータを事前学習するにはmodel.pretrain関数 (24行目)を使います。 引数の意味は下記の通りです。
dataset(ExpertDataset型) データセット
n_epochs(int型) 学習の反復回数
learning_rate(float型) 学習率
adam_epsilon(float型) Adamオプティマイザーのε(エプシロン)
val_interval(int型) nエポック毎に学習と検証の損失を出力
また模倣学習を行った後、さらに強化学習を行う場合はmodel.learn関数 (27行目)をコメントアウトします。
実行
実行すると、スコアは「120.2」になりました。(人間のデモ操作によって結果は変わります。)
模倣学習と合わせて強化学習も合わせて実行した結果や、強化学習のみで実行した結果も調査していきたいと思います。