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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

Python 3.x

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

Python

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

Q&A

0回答

518閲覧

Chainerを使ったDeep Q Networkの実装でのType Checkエラー

re-re-

総合スコア13

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/08/11 03:55

編集2019/08/11 04:01

強化学習について成果物を作る必要があり、三目並べを参考にプログラムを実装しました。ゲームの仕様はdungeon.pyに実装しており、定義したマス数+周囲分の1マスを対象のボードとします。(N=3なら 5×5のボードで内周1マスが落とし穴となる)この質問ではN=3つまり5×5を想定させてください。

ユーザははじめ(1, 1)にいて、そのままランダムアクションと学習ずみのアクションを用いてゴール(3×3)を目指します。動き方は(右左下上)の4パターンで1マスずつ移動します。何度か思考を繰り返したのち、(Goal, Miss, Starvation)のいずれかの報酬をえます。Goalはゴールマスに到着した場合、Missは内周1マスの落とし穴にハマった場合、Starvationは10アクション以内にゴールできない場合です。Goal時のみreward=50を受け取ります。

以下にコードを掲載いたします。なお前述の三目並べを参考にしております。探索に必要なパラメータは次元数を(5*5の25)とし、アクションの次元数を4(右左下上)としました。dqn.pyにつきましては参照元と一緒のため割愛させていただきたいです。

python3

1#dungeon.py 2import numpy as np 3 4 5#ゲームボード 6class Dungeon(): 7 def __init__(self, n): 8 self.n = n 9 self.obs_size = (n + 2) * (n + 2) 10 self.action_size = 4 11 # board の初期化 12 board = [] 13 for i in range(n + 2): 14 line = np.array([0] * (n + 2), dtype=np.float32) 15 board.append(line) 16 self.board = np.array(board, dtype=np.float32) 17 ## board の外周に落とし穴(-1)を設置 18 self.board[0] = np.array([-1] * (n + 2), dtype=np.float32) 19 self.board[n + 1] = np.array([-1] * (n + 2), dtype=np.float32) 20 for pos in self.board: 21 pos[0] = -1 22 pos[n + 1] = -1 23 self.board[n][n] = 10 24 25 self.pos = [1, 1] 26 self.random_count = 0 27 self.goal = False 28 self.missed = False 29 30 31 def reset(self): 32 self.pos = [1, 1] 33 self.goal = False 34 self.missed = False 35 36 37 def move(self, direction): 38 if direction == "right": 39 # right 40 x_pos = self.pos[0] + 1 41 y_pos = self.pos[1] 42 self.pos = [x_pos, y_pos] 43 if self.board[x_pos][y_pos] < 0: 44 self.missed = True 45 46 elif self.board[x_pos][y_pos] == 10: 47 self.goal = True 48 49 elif direction == "left": 50 # left 51 x_pos = self.pos[0] - 1 52 y_pos = self.pos[1] 53 self.pos = [x_pos, y_pos] 54 if self.board[x_pos][y_pos] < 0: 55 self.missed = True 56 57 elif self.board[x_pos][y_pos] == 10: 58 self.goal = True 59 60 elif direction == "upper": 61 # upper 62 x_pos = self.pos[0] 63 y_pos = self.pos[1] - 1 64 self.pos = [x_pos, y_pos] 65 if self.board[x_pos][y_pos] < 0: 66 self.missed = True 67 68 elif self.board[x_pos][y_pos] == 10: 69 self.goal = True 70 71 elif direction == "lower": 72 # lower 73 x_pos = self.pos[0] 74 y_pos = self.pos[1] + 1 75 self.pos = [x_pos, y_pos] 76 77 if self.board[x_pos][y_pos] < 0: 78 self.missed = True 79 80 elif self.board[x_pos][y_pos] == 10: 81 self.goal = True 82 83 def get_random_action(self): 84 self.random_count += 1 85 directions = ["right", "left", "upper", "lower"] 86 return np.random.choice(directions) 87 88 def copy(self): 89 line_board = self.board.copy() 90 x_pos = self.pos[0] 91 y_pos = self.pos[1] 92 line_board[x_pos][y_pos] = 1 93 return line_board.flatten() 94 95 def show(self): 96 line_board = self.board.copy() 97 x_pos = self.pos[0] 98 y_pos = self.pos[1] 99 line_board[x_pos][y_pos] = 1 100 print(line_board)

python3

1#train_dungeon.py 2from dqn import QFunctions 3from dungeon import Dungeon 4 5import chainer 6import chainerrl 7import numpy as np 8from tqdm import tqdm 9 10 11if __name__ == "__main__": 12 N = 3 # 3 * 3のマスであることを宣言 13 d = Dungeon(N) 14 # 環境の次元数 15 obs_size = d.obs_size 16 # 行動の次元数 17 n_actions = d.action_size 18 19 q_func = QFunctions(obs_size, n_actions) 20 optimizer = chainer.optimizers.Adam(eps=1e-2) 21 optimizer.setup(q_func) 22 # 報酬の割引率 23 gamma = 0.95 24 # epsilon-greedyを使ってたまに冒険 25 explorer = chainerrl.explorers.LinearDecayEpsilonGreedy( 26 start_epsilon=1.0, end_epsilon=0.3, decay_steps=50000, random_action_func=d.get_random_action 27 ) 28 replay_buffer = chainerrl.replay_buffer.ReplayBuffer(capacity=10**6) 29 # agentの生成 30 phi = lambda x:x.astype(np.float32, copy=False) 31 agent_p1 = chainerrl.agents.DoubleDQN(q_func, optimizer, replay_buffer, gamma, explorer, replay_start_size=500, update_interval=1, target_update_interval=100, phi=phi) 32 33 34 print("Start train...") 35 # 学習ゲーム回数 36 n_episodes = 20000 37 miss = 0 38 goal = 0 39 starvation = 0 40 # 繰り返し実行 41 for i in range(1, n_episodes + 1): 42 d.reset() 43 reward = 0 44 count = 0 45 while not d.goal and not d.missed: 46 print("before: ", d.pos) 47 print(d.show(), reward) 48 action = agent_p1.act_and_train(d.copy(), reward) 49 print("action choice") 50 d.move(action) 51 print("after: ", d.pos) 52 print(d.show(), reward) 53 54 #ゲームが終わった場合 55 if d.goal == True: 56 print("-----Goal-----") 57 goal += 1 58 reward = 50 59 if agent_p1.last_state is not None: 60 continue 61 62 else: 63 agent_p1.stop_episode_and_train(d.copy(), reward, True) 64 65 elif d.missed == True: 66 print("-----Miss-----") 67 miss += 1 68 reward = 0 69 if agent_p1.last_state is not None: 70 continue 71 72 else: 73 agent_p1.stop_episode_and_train(d.copy(), reward, True) 74 75 else: 76 print("-----Stay-----") 77 count += 1 78 79 if count > 10: 80 print("-----Starvation-----") 81 starvation += 1 82 if agent_p1.last_state is not None: 83 continue 84 85 else: 86 agent_p1.stop_episode_and_train(d.copy(), 0, True) 87 continue 88 89 90 if i % 100 == 0: 91 print("episode:", i, " / rnd:", d.random_count, " / miss:", miss, " / goal:", goal, " / starvation:", starvation, " / statistics:", agent_p1.get_statistics(), " / epsilon:", agent_p1.explorer.epsilon) 92 #カウンタの初期化 93 miss = 0 94 goal = 0 95 starvation = 0 96 d.random_count = 0 97 98 99agent_p1.save("result_" + str(i)) 100print("Training finished.")

このコードを実行したところ、100回程度ループが回り学習が進むのですが、その後、以下のエラーが発生してしまいます。

Error

1Traceback (most recent call last): 2 File "train_dungeon.py", line 51, in <module> 3 action = agent_p1.act_and_train(d.copy(), reward) 4 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainerrl/agents/dqn.py", line 424, in act_and_train 5 self.replay_updater.update_if_necessary(self.t) 6 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainerrl/replay_buffer.py", line 545, in update_if_necessary 7 self.update_func(transitions) 8 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainerrl/agents/dqn.py", line 237, in update 9 loss = self._compute_loss(exp_batch, errors_out=errors_out) 10 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainerrl/agents/dqn.py", line 353, in _compute_loss 11 y, t = self._compute_y_and_t(exp_batch) 12 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainerrl/agents/dqn.py", line 334, in _compute_y_and_t 13 batch_actions), (batch_size, 1)) 14 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainerrl/action_value.py", line 79, in evaluate_actions 15 return F.select_item(self.q_values, actions) 16 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainer/functions/array/select_item.py", line 120, in select_item 17 return SelectItem().apply((x, t))[0] 18 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainer/function_node.py", line 297, in apply 19 self._check_data_type_forward(in_data) 20 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainer/function_node.py", line 400, in _check_data_type_forward 21 self.check_type_forward(in_type) 22 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainer/functions/array/select_item.py", line 23, in check_type_forward 23 x_type.shape[0] == t_type.shape[0], 24 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainer/utils/type_check.py", line 550, in expect 25 expr.expect() 26 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainer/utils/type_check.py", line 483, in expect 27 '{0} {1} {2}'.format(left, self.inv, right)) 28chainer.utils.type_check.InvalidType: 29Invalid operation is performed in: SelectItem (Forward) 30 31Expect: t.dtype.kind == i 32Actual: U != i 33コード

型系のエラーと判断しデバッグを進めたところ、

Error

1 File "/home/vagrant/source_code/ML/dqn_test/lib/python3.7/site-packages/chainer/functions/array/select_item.py", line 120, in select_item 2 return SelectItem().apply((x, t))[0]

に注目して、原因はSelectItem()をコールする際の、tとxの型の不一致が原因とわかりました。またagent_p1.act_and_train(d.copy(), reward)を実行する場合には本来はx,tは
(1, 4) (1,)
となるはずなのに、
(32, 4) (32,)となっていることもわかりました。

さらにデバッグを進めたところ、本来while文内で1ループにつきact_and_trainは一度しか呼ばれないはずなのに、2度呼ばれていることがわかりました。また呼ばれているのはprint("action choice")の前の段階であることもわかりました。つまり二度続けて関数が呼ばれてしまっていることがわかりました。

ここまでデバッグして先に進めなくなってしまいました。非常に困っています....原因の御心あたりのあるかたや強化学習の実装経験があるかたがございましたらぜひアドバイスをいただきたく思います。なお、Python 3.7.0を使用しています。

参考

pipfreeze

1cached-property==1.5.1 2chainer==6.2.0 3chainerrl==0.7.0 4cloudpickle==1.2.1 5filelock==3.0.12 6future==0.17.1 7gym==0.14.0 8numpy==1.17.0 9Pillow==6.1.0 10protobuf==3.7.1 11pyglet==1.3.2 12scipy==1.3.0 13six==1.12.0 14tqdm==4.32.2 15typing==3.6.6 16typing-extensions==3.6.6

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問