前提・実現したいこと
「現場で使える Python 深層強化学習入門」という書籍の内容を勉強しています
書籍の四章でDQNアルゴリズムについて[Open AI Gym]のPendulumを使って勉強しています
その中で[experience replay(経験再生)]について触れているのですが、経験再生をする場合としない場合の差を知りたいのですがうまくコードをいじれません
発生している問題・エラーメッセージ
TypeError: 'int' object is not subscriptable
該当のソースコード
python
1""" 2overview: 3 OpenAI GymのPendulum-v0を環境として、Double_DQNの学習を行う 4 5args: 6 各種パラメータの設定値は、本コード中に明記される 7 - result_dir: 8 結果を出力するディレクトリのpath 9 - max_episode: 10 学習の繰り返しエピソード数(default: 300) 11 - max_step: 12 1エピソード内の最大ステップ数(default: 200) 13 - gamma: 14 割引率(default: 0.99) 15output: 16 result_dirで指定したpathに以下のファイルが出力される 17 - episode_xxx.h5: 18 xxxエピソードまで学習したDouble_DQNネットワークの重み 19 - history.csv: エピソードごとの以下の3つのメトリックを記録するcsv 20 - loss: DoubleDQNモデルを更新する際のlossの平均値 21 - td_error: TD誤差の平均値 22 - reward_avg: 1ステップあたりの平均報酬 23 24usage: 25 python3 train.py 26""" 27import os 28import random 29 30import gym 31import numpy as np 32 33from agent.model import Qnetwork 34from agent.policy import EpsilonGreedyPolicy 35from util import now_str, RecordHistory 36 37 38def train(): 39 # setup =========================== 40 max_episode = 100 # 学習において繰り返す最大エピソード数 41 max_step = 200 # 1エピソードの最大ステップ数 42 n_warmup_steps = 10000 # warmupを行うステップ数 43 interval = 1 # モデルや結果を吐き出すステップ間隔 44 actions_list = [-1, 1] # 行動(action)の取りうる値のリスト 45 gamma = 0.99 # 割引率 46 epsilon = 0.1 # ε-greedyのパラメータ 47 memory_size = 10000 48 batch_size = 32 49 result_dir = os.path.join('./result/pendulum', 50 now_str()) 51 52 # インスタンス作成 ================== 53 os.makedirs(result_dir, exist_ok=True) 54 print(result_dir) 55 env = gym.make('Pendulum-v0') 56 dim_state = env.env.observation_space.shape[0] 57 q_network = Qnetwork(dim_state, 58 actions_list, 59 gamma=gamma) 60 policy = EpsilonGreedyPolicy(q_network, 61 epsilon=epsilon) 62 header = [ 63 "num_episode", "loss", "td_error", "reward_avg" 64 ] 65 recorder = RecordHistory( 66 os.path.join(result_dir, "history.csv"), header) 67 recorder.generate_csv() 68 69 # warmup======================= 70 print('warming up {:,} steps...'.format( 71 n_warmup_steps)) 72 memory = [] 73 total_step = 0 74 step = 0 75 state = env.reset() 76 while True: 77 step += 1 78 total_step += 1 79 80 action = random.choice(actions_list) 81 epsilon, q_values = 1.0, None 82 83 next_state, reward, done, info = env.step( 84 [action]) 85 86 # reward clipping 87 if reward < -1: 88 c_reward = -1 89 else: 90 c_reward = 1 91 memory.append( 92 (state, action, c_reward, next_state, done)) 93 state = next_state 94 95 if step > max_step: 96 state = env.reset() 97 step = 0 98 if total_step > n_warmup_steps: 99 break 100 memory = memory[-memory_size:] 101 print('warming up {:,} steps... done.'.format( 102 n_warmup_steps)) 103 104 # training====================== 105 print( 106 'training {:,} episodes...'.format(max_episode)) 107 num_episode = 0 108 episode_loop = True 109 while episode_loop: 110 num_episode += 1 111 step = 0 112 step_loop = True 113 episode_reward_list, loss_list, td_list = [], [], [] 114 state = env.reset() 115 116 while step_loop: 117 step += 1 118 total_step += 1 119 action, epsilon, q_values = policy.get_action( 120 state, actions_list) 121 next_state, reward, done, info = env.step( 122 [action]) 123 124 # reward clipping 125 if reward < -1: 126 c_reward = -1 127 else: 128 c_reward = 1 129 130 memory.append((state, action, c_reward, 131 next_state, done)) 132 episode_reward_list.append(c_reward) 133 #経験再生をする場合:exps = random.sample(memory, batch_size) 134 exps = (memory, batch_size)#ここの書き換えが分かりません 135 loss, td_error = q_network.update_on_batch( 136 exps) 137 loss_list.append(loss) 138 td_list.append(td_error) 139 140 q_network.sync_target_network(soft=0.01) 141 state = next_state 142 memory = memory[-memory_size:] 143 144 # end of episode 145 if step >= max_step: 146 step_loop = False 147 reward_avg = np.mean(episode_reward_list) 148 loss_avg = np.mean(loss_list) 149 td_error_avg = np.mean(td_list) 150 print( 151 "{}episode reward_avg:{} loss:{} td_error:{}" 152 .format(num_episode, reward_avg, 153 loss_avg, td_error_avg)) 154 if num_episode % interval == 0: 155 model_path = os.path.join( 156 result_dir, 157 'episode_{}.h5'.format( 158 num_episode)) 159 q_network.main_network.save( 160 model_path) 161 history = { 162 "num_episode": num_episode, 163 "loss": loss_avg, 164 "td_error": td_error_avg, 165 "reward_avg": reward_avg 166 } 167 recorder.add_histry(history) 168 169 if num_episode >= max_episode: 170 episode_loop = False 171 172 env.close() 173 print('training {:,} episodes... done.'.format( 174 max_episode)) 175 176 177if __name__ == '__main__': 178 train() 179
試したこと
おそらくコメントにしてある#exps = random.sample(memory, batch_size)、が経験再生の部分だと思うので、ここをrandamを使わずに直前のmemoryとbatch_sizeを使えばいいと考えています。
ただ、どうすれば直前のmemoryとbatch_sizeを取得できるのかわかりません。
memoryは多次元配列という認識です
exps自体を消せばいいのかとも思いましたが、そうすると、loss_list[]とtd_list[]の取得をどうすればいいのかわかりませんでした。
補足情報(FW/ツールのバージョンなど)
サンプルコードはここから拾いました
https://www.shoeisha.co.jp/book/download/9784798159928/detail
これの4-2_dqn_pendulum #第4章 DQNによる倒立振子制御, の[train.py]というファイルの中のコードです
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。