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

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

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

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

Python

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

受付中

chainerrlのDQNを用いた際に,エージェントを保存した際(学習時)と,読み込んで使用した際の結果が大きく異なる

akibin-0219
akibin-0219

総合スコア9

Chainer

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

Python

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

0回答

0リアクション

0クリップ

125閲覧

投稿2022/09/14 14:00

編集2022/09/14 14:02

やっている事

現在,書籍(https://www.ohmsha.co.jp/book/9784274222535/)
とchainerのドキュメントを参考に,DQNを用いてOpen AI gymの倒立振子(cartpole.py)を通して深層強化学習の実装方法を学んでいます.

実現したいこと

学習済みのエージェントの保存・読み込みを行い,学習時と同程度のスコアを出せる(再利用)ような仕組みを作ろうと試みています

発生している問題

結論,学習時・保存時のエージェントのスコアと,保存したものを再度読み込んでテストした時のエージェントのスコアが大きく異なってしまっています.
エージェント保存時,.npzファイルと一緒に保存時のエピソードでのスコアもあとから確認できるようにdfにまとめて出力しているのですが,そのスコアが保存したエージェントを読み込んで使用した時の結果と一致しません(読み込んで使用した際,どのエピソードで保存されたモデルでも最大スコアである[R:200]に近い値が出てしまっている)
エラーは発生しておらず,実行自体はできている状態です.
以下が学習・保存時のスコアと,保存したものを読み込んで使用した際のスコアです.

※[num_ep]列がエージェントが保存された時のエピソード番号です(50エピソードごとに1つのエージェントを保存しています)
※同じ[num_ep]のエージェントが保存時と,読み込み時で対応するイメージです

-↓学習・保存時のスコア

num_epRaverage_Q
034-0.006249658
504416.69693047
1002932.16324093
15020048.54096041
20020080.91322302
25017094.64694452

-↓保存したエージェント読み込んで使用した際のスコア

num_epRaverage_Q
019598.00143342
5019997.67563928
10018997.38097469
15018697.1402428
20019796.96119497
25017996.77948363

学習・保存時のソースコード

python

import gym #倒立振子(cartpole)の実行環境 import numpy as np import time import chainer import chainer.functions as F import chainer.links as L import chainerrl import pandas as pd # Q-関数の定義 class QFunction(chainer.Chain): def __init__(self, obs_size, n_actions, n_hidden_channels=50): super(QFunction, self).__init__() with self.init_scope(): self.l0=L.Linear(obs_size, n_hidden_channels) self.l1=L.Linear(n_hidden_channels, n_hidden_channels) self.l2=L.Linear(n_hidden_channels, n_actions) def __call__(self, x, test=False): h = F.tanh(self.l0(x)) h = F.tanh(self.l1(h)) return chainerrl.action_value.DiscreteActionValue(self.l2(h)) env = gym.make('CartPole-v0') gamma = 0.99 alpha = 0.5 max_number_of_steps = 200 #総試行回数 num_episodes = 300 #総試行回数 q_func = QFunction(env.observation_space.shape[0], env.action_space.n) optimizer = chainer.optimizers.Adam(eps=1e-2) optimizer.setup(q_func) explorer = chainerrl.explorers.LinearDecayEpsilonGreedy(start_epsilon=1.0, end_epsilon=0.1, decay_steps=num_episodes, random_action_func=env.action_space.sample) replay_buffer = chainerrl.replay_buffer.ReplayBuffer(capacity=10 ** 6) phi = lambda x: x.astype(np.float32, copy=False) agent = chainerrl.agents.DoubleDQN( q_func, optimizer, replay_buffer, gamma, explorer, replay_start_size=500, update_interval=1, target_update_interval=100, phi=phi) #agent.load('agent') train_analysis_df=pd.DataFrame(columns=['num_ep','R','average_Q']) saved_agent_df=pd.DataFrame(columns=['num_ep','R','average_Q']) for episode in range(num_episodes): #試行数分繰り返す observation = env.reset() done = False reward = 0 R = 0 add_s=pd.Series(index=train_analysis_df.columns, dtype='object') for t in range(max_number_of_steps): #1試行のループ action = agent.act_and_train(observation, reward) observation, reward, done, info = env.step(action) R += reward if done: break agent.stop_episode_and_train(observation, reward, done) if episode % 10 == 0: print('episode:', episode, 'R:', R, 'statistics:', agent.get_statistics()) add_s['num_ep']=episode add_s['R']=R add_s['average_Q']=agent.get_statistics()[0][1] add_s['end_t']=t if episode % 50 == 0: saved_agent_df=saved_agent_df.append(add_s,ignore_index=True) agent.save('agent/cartpole/agent_ep{}'.format(episode)) saved_agent_df.to_csv('agent/cartpole/saved_agent_df.csv')

保存したエージェントを読み込んで使用する際のソースコード

python

eps=[0,50,100,150,200,250] class QFunction(chainer.Chain): def __init__(self, obs_size, n_actions, n_hidden_channels=50): super(QFunction, self).__init__() with self.init_scope(): self.l0=L.Linear(obs_size, n_hidden_channels) self.l1=L.Linear(n_hidden_channels, n_hidden_channels) self.l2=L.Linear(n_hidden_channels, n_actions) def __call__(self, x, test=False): h = F.tanh(self.l0(x)) h = F.tanh(self.l1(h)) return chainerrl.action_value.DiscreteActionValue(self.l2(h)) env = gym.make('CartPole-v0') gamma = 0.99 alpha = 0.5 max_number_of_steps = 200 #総試行回数 num_episodes = 300 #総試行回数 test_log_df=pd.DataFrame(columns=['num_ep','R','average_Q','end_t']) for episode in eps: #試行数分繰り返す q_func = QFunction(env.observation_space.shape[0], env.action_space.n) optimizer = chainer.optimizers.Adam(eps=1e-2) optimizer.setup(q_func) explorer = chainerrl.explorers.LinearDecayEpsilonGreedy(start_epsilon=1.0, end_epsilon=0.1, decay_steps=num_episodes, random_action_func=env.action_space.sample) replay_buffer = chainerrl.replay_buffer.ReplayBuffer(capacity=10 ** 6) phi = lambda x: x.astype(np.float32, copy=False) load_agent = chainerrl.agents.DoubleDQN( q_func, optimizer, replay_buffer, gamma, explorer, replay_start_size=500, update_interval=1, target_update_interval=100, phi=phi) agent_pass='agent/cartpole/agent_ep{}'.format(episode) load_agent.load(agent_pass) observation = env.reset() done = False reward = 0 R = 0 add_s=pd.Series(index=train_analysis_df.columns, dtype='object') for t in range(max_number_of_steps): #1試行のループ #action = agent.act_and_train(observation, reward) action = agent.act(observation) observation, reward, done, info = env.step(action) R += reward if done: break add_s['num_ep']=episode add_s['R']=R add_s['average_Q']=agent.get_statistics()[0][1] add_s['end_t']=t test_log_df=test_log_df.append(add_s,ignore_index=True) test_log_df.to_csv('agent/cartpole/test_log.csv')

試したこと・自分が想定していたこと

エージェントの読み込み方法は↓を参考にしました.
https://chainerrl.readthedocs.io/en/latest/agents.html

自分の方で調べた限りでは,あまりload()メソッドの使用例が見つけられず,かつ今回のような問題が発生したため質問した次第です.
個人的には保存したエージェント読み込み時の

python

optimizer = chainer.optimizers.Adam(eps=1e-2) optimizer.setup(q_func) explorer = chainerrl.explorers.LinearDecayEpsilonGreedy(start_epsilon=1.0, end_epsilon=0.1, decay_steps=num_episodes, random_action_func=env.action_space.sample) replay_buffer = chainerrl.replay_buffer.ReplayBuffer(capacity=10 ** 6) phi = lambda x: x.astype(np.float32, copy=False) load_agent = chainerrl.agents.DoubleDQN( q_func, optimizer, replay_buffer, gamma, explorer, replay_start_size=500, update_interval=1, target_update_interval=100, phi=phi) agent_pass='agent/cartpole/agent_ep{}'.format(episode) load_agent.load(agent_pass)

の読み込み用のエージェント定義部分・読み込み部が何か間違っているのかな?と考えていたのですが,解決方法が見つけられませんでした.
(自分の考えでは仮のload_agentおよびexplorer やoptimizer を定義して,.load()メソッドを使用すればパラメータが上書きされるような形となり使用できると思っていました.)

まだ自分自身も理解が浅い部分も多いですが,ミス・および参考になる記事等があったら教示のほどよろしくお願い致します。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Chainer

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

Python

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