カスタムGym環境作成(7) - ちょっと複雑なマップをACKTRで完全攻略

前回ACKTRアルゴリズムで学習モデルを作成しました。

今回はそのモデルを読み込んで、ちょっとだけ複雑にしたマップを攻略できるかどうか確認します。

ACKTR学習済みモデルを使って攻略

ACKTRアルゴリズムで学習したモデルを読み込んで、カスタム環境にて実行させます。

[ソース]

play5.py
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
# 警告を非表示
import warnings
warnings.simplefilter('ignore')
import tensorflow as tf
tf.get_logger().setLevel("ERROR")

import gym
from env4 import MyEnv

from stable_baselines.common.vec_env import DummyVecEnv
from stable_baselines import ACKTR

# 環境の生成
env = MyEnv()
env = DummyVecEnv([lambda: env])

# モデルの読み込み
model = ACKTR.load('model4')

# モデルのテスト
state = env.reset()
total_reward = 0
while True:
# 環境の描画
env.render()

# モデルの推論
action, _ = model.predict(state)

# 1ステップの実行
state, reward, done, info = env.step(action)
total_reward += reward
print('reward:', reward, 'total_reward', total_reward)
print('-----------')

print('')
# エピソード完了
if done:
# 環境の描画
print('total_reward:', total_reward)
break

実行結果は以下のようになりました。

[結果]

Loading a model without an environment, this model cannot be trained until it has a valid environment.
☆山山 山 山G
 山  山 山 
    山   
山 山山山  山
山 山     
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-1.]
-----------

S山山 山 山G
☆山  山 山 
    山   
山 山山山  山
山 山     
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-2.]
-----------

S山山 山 山G
 山  山 山 
☆   山   
山 山山山  山
山 山     
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-3.]
-----------

S山山 山 山G
 山  山 山 
 ☆  山   
山 山山山  山
山 山     
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-4.]
-----------

S山山 山 山G
 山  山 山 
    山   
山☆山山山  山
山 山     
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-5.]
-----------

S山山 山 山G
 山  山 山 
    山   
山 山山山  山
山☆山     
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-6.]
-----------

S山山 山 山G
 山  山 山 
    山   
山 山山山  山
山 山     
 ☆  山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-7.]
-----------

S山山 山 山G
 山  山 山 
    山   
山 山山山  山
山 山     
  ☆ 山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-8.]
-----------

S山山 山 山G
 山  山 山 
    山   
山 山山山  山
山 山     
   ☆山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-9.]
-----------

S山山 山 山G
 山  山 山 
    山   
山 山山山  山
山 山☆    
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-10.]
-----------

S山山 山 山G
 山  山 山 
    山   
山 山山山  山
山 山 ☆   
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-11.]
-----------

S山山 山 山G
 山  山 山 
    山   
山 山山山  山
山 山  ☆  
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-12.]
-----------

S山山 山 山G
 山  山 山 
    山   
山 山山山☆ 山
山 山     
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-13.]
-----------

S山山 山 山G
 山  山 山 
    山☆  
山 山山山  山
山 山     
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-14.]
-----------

S山山 山 山G
 山  山 山 
    山 ☆ 
山 山山山  山
山 山     
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-15.]
-----------

S山山 山 山G
 山  山 山 
    山  ☆
山 山山山  山
山 山     
    山  山
山山  山山  
山山山 山山 山
reward: [-1.] total_reward [-16.]
-----------

S山山 山 山G
 山  山 山☆
    山   
山 山山山  山
山 山     
    山  山
山山  山山  
山山山 山山 山
reward: [100.] total_reward [84.]
-----------

total_reward: [84.]

まっすぐにスタート地点からゴールまで進んでいることが分かります。

少しだけ複雑にしたマップでもきちんと学習できるようになりました。改善したは次の2点です。

  • 学習済みアルゴリズムを変更
    PPO2からACKTRに学習アルゴリズムを変更しました。
  • 学習ステップ数を5倍に変更
    学習ステップ数を128000から128000*5に変更しました。

カスタム環境を変えて、うまく学習できなくなった場合はこのような変更を行って試行錯誤することが必要になるようです。

また、まったく同じ条件で学習してもうまく学習できる場合とそうでない場合があります。

何度か実行してみて平均報酬平均エピソード長などをグラフ化しきちんと収束(学習)できているかどうかを確認する必要もあります。

AI全般そうかと思いますが、強化学習に関する作業もなかなか地道なものが多いですね😌