質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenAI Gym

OpenAI Gymは、強化学習を開発・強化するためのシミュレーション環境です。強化学習における実験や評価環境などを標準化し提供することを目的としています。さらに、結果をアップロードしたり、他の人の実行結果や実装を見ることも可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pip

pipとは、Pythonを用いて書かれているパッケージソフトのインストールや管理を行うためのパッケージマネジメントシステムです。pipを使う主なメリットは、コマンドラインインターフェースにて容易にPythonパッケージソフトをインストール可能だという点です。

Q&A

解決済

1回答

1965閲覧

Python, DQN, Pendulum, 配列の取得, randam.sample()

wpx-vv1uZ

総合スコア23

OpenAI Gym

OpenAI Gymは、強化学習を開発・強化するためのシミュレーション環境です。強化学習における実験や評価環境などを標準化し提供することを目的としています。さらに、結果をアップロードしたり、他の人の実行結果や実装を見ることも可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pip

pipとは、Pythonを用いて書かれているパッケージソフトのインストールや管理を行うためのパッケージマネジメントシステムです。pipを使う主なメリットは、コマンドラインインターフェースにて容易にPythonパッケージソフトをインストール可能だという点です。

0グッド

0クリップ

投稿2020/01/19 06:39

前提・実現したいこと

「現場で使える 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]というファイルの中のコードです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

exps = (memory)
とすれば一応動きました
あっているかはいまいち分かりませんが、これで終わります

投稿2020/01/25 02:12

wpx-vv1uZ

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問