Start_python’s diary

ふたり暮らし

アラフィフ夫婦のフリーランスプラン

Kerasで予測した結果を出す(Python predictメソッドの使い方)

Deep Q-Network(DQN)による倒立振子 第5回

はじめに

モジュールのバージョン問題やクラスの理解不足でなかなか先に進みません。

今回からメイン部分を見ていきます。

 

# [5.3]メインルーチン--------------------------------------------------------
for episode in range(num_episodes):  # 試行数分繰り返す
    env.reset()  # cartPoleの環境初期化
    state, reward, done, _ = env.step(env.action_space.sample())  # 1step目は適当な行動をとる
    state = np.reshape(state, [1, 4])   # list型のstateを、1行4列の行列に変換
    episode_reward = 0

    targetQN = mainQN   # 行動決定と価値計算のQネットワークをおなじにする

    for t in range(max_number_of_steps + 1):  # 1試行のループ
        if (islearned == 1) and LENDER_MODE:  # 学習終了したらcartPoleを描画する
            env.render()
            time.sleep(0.001)
            print(state[0, 0])  # カートのx位置を出力するならコメントはずす

        action = actor.get_action(state, episode, mainQN)   # 時刻tでの行動を決定する
        next_state, reward, done, info = env.step(action)   # 行動a_tの実行による、s_{t+1}, _R{t}を計算する
        next_state = np.reshape(next_state, [1, 4])     # list型のstateを、1行4列の行列に変換

        # 報酬を設定し、与える
        if done:
            next_state = np.zeros(state.shape)  # 次の状態s_{t+1}はない
            if t < 195:
                reward = -1  # 報酬クリッピング、報酬は1, 0, -1に固定
            else:
                reward = 1  # 立ったまま195step超えて終了時は報酬
        else:
            reward = 0  # 各ステップで立ってたら報酬追加(はじめからrewardに1が入っているが、明示的に表す)

        episode_reward += 1 # reward  # 合計報酬を更新

        memory.add((state, action, reward, next_state))     # メモリの更新する
        state = next_state  # 状態更新

 

試行数のfor文。299回(num_episodes)ループ処理します。(棒が倒れるまでを1試行とし、299試行繰り返します)

変数state: 状態(カート位置、カート速度、棒の角度、棒の角速度)を1行4列のリストに変換します。

変数episode_reward:(合計報酬)を 0にします。

 

行動数のfor文。200回(max_number_of_steps)ループ処理します。(左右移動を1行動とし最大200行動を1試行としています)

 

action = actor.get_action(state, episode, mainQN)   # 時刻tでの行動を決定する

# [4]カートの状態に応じて、行動を決定するクラス
class Actor:
    def get_action(self, state, episode, targetQN):   # [C]t+1での行動を返す
        # 徐々に最適行動のみをとる、ε-greedy法
        epsilon = 0.001 + 0.9 / (1.0+episode)

        if epsilon <= np.random.uniform(0, 1):
            retTargetQs = targetQN.model.predict(state)[0]
            action = np.argmax(retTargetQs)  # 最大の報酬を返す行動を選択する

        else:
            action = np.random.choice([0, 1])  # ランダムに行動する

        return action

 

retTargetQs = targetQN.model.predict(state)[0]

現在の学習したモデルで予測した結果を出します。

( [0]で次の動作のみ。[0]は入れなくてもいいかもしれません )

predictメソッド

戻り値 = model.predict(引数)

入力サンプルに対する予測値の出力を生成します。

引数: 入力データでNumpy配列の形式

戻り値: 予測値を格納したNumpy配列

 

action = np.argmax(retTargetQs)   # 最大の報酬を返す行動を選択する

np.argmax関数は以前詳しくやりました。

配列の大きい値の方の配列番号を返します。(0なら左、1なら右 )

 

次の行動により報酬を与える。立っているときは報酬 0、195ステップ以上立って終了したら報酬 1、それ以前に倒れたら報酬-1を与えています。

 

memory.add*1   # メモリの更新する

class Memory:
    def add(self, experience):
        self.buffer.append(experience)

 

memory.bufferに(状態、アクション、報酬、次の状態)を追加します。

状態は(カート位置、カート速度、棒の角度、棒の角速度)です。

 

print(memory.buffer) で表示するとこんな感じです。

f:id:Start_python:20191205170317p:plain

 

 

本日はここまで。次回に続きます。

 

 

参考サイト

neuro-educator.com

keras.io

 

 

 

保存ファイル

lesson49.py

 

 

文責:Luke

*1:state, action, reward, next_state