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) で表示するとこんな感じです。
本日はここまで。次回に続きます。
参考サイト
保存ファイル
lesson49.py
文責:Luke
*1:state, action, reward, next_state