Translate

2021年3月17日水曜日

OpenAI Gym カスタム環境のinfoに"episode"というキーで値を入れたら1回目のミニバッチ終了時にTypeErrorが発生する件

OpenAI Gym のカスタム環境クラスをつくったのだが、
環境クラス内部でエピソード番号を表示させたくなった。

そこで
step()の戻り値の一つinfoが特に型が決まっていないので
__init__()内で辞書self.infoを作ってその中にカウンタ用の
整数を入れてreset()が呼び出されるたびに加算するように
実装した。

以下のコードは、独自環境クラスの例である。

class TestEnv(gym.Env):
    def __init__(self):
            super().__init__()
            self.action_space = gym.spaces.Box(
                low= -1, high=+1, shape=(3,), dtype=np.float32)
            self.observation_space = gym.spaces.Box(
                low=0, high=255, shape=(120, 160, 3), dtype=np.uint8)
            self.info = {
                'episode': 1,
            }

    def reset(self):
        self.info['episode'] += 1
        return np.zeros(shape=(120, 160, 3))

    def step(self, action):
        return np.zeros(shape=(120, 160, 3)), 1.0, True, self.info


そして、以下のように強化学習トレーニングを実行しようとした。

env = TestEnv()
from stable_baselines3 import SAC
model = SAC('CnnPolicy', env, verbose=1, tensorboard_log='./logs')
model.learn(total_timesteps=4096)


すると..

C:\Users\XXXXX\Anaconda3\envs\gym_donkey\lib\site-packages\torch\cuda\__init__.py:52: UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at  ..\c10\cuda\CUDAFunctions.cpp:100.)
  return torch._C._cuda_getDeviceCount() > 0
Using cpu device
Wrapping the env in a DummyVecEnv.
Wrapping the env in a VecTransposeImage.
Logging to ./logs\PPO_1
Traceback (most recent call last):
  File "tests\test_gym.py", line XX, in <module>
    test_learn_ppo()
  File "tests\test_gym.py", line XX, in test_learn_ppo
    model.learn(total_timesteps=4096)
  File "C:\Users\XXXXXX\Anaconda3\envs\gym_donkey\lib\site-packages\stable_baselines3\ppo\ppo.py", line 264, in learn
    reset_num_timesteps=reset_num_timesteps,
  File "C:\Users\XXXXXX\Anaconda3\envs\gym_donkey\lib\site-packages\stable_baselines3\common\on_policy_algorithm.py", line 234, in learn
    if len(self.ep_info_buffer) > 0 and len(self.ep_info_buffer[0]) > 0:
TypeError: object of type 'int' has no len()

(gym) D:\projects\hogegoge>


そこでカスタム環境クラスのself.infoで扱う'episode'キーワードを
別のラベルに変更すると..正常動作するようになった...

どうも、親クラスでself.infoを使っていて
しかもOpenAI Gym内部で'episode'キーワードを使っているらしく
想定外の型(上記例ではstr)が入っていてエラーになってしまったらしい..


Stable Baselines3 はドキュメントが充実しているのが売りだったはずなのに..

..公式ドキュメントに、書いててほしかった..


0 件のコメント:

ClaudeをOpenAI O1のように思考させるDifyサンプルを試す

 Difyの「探索」タブにはさまざまなサンプルが載っており、その1つに「Thinking Claude (OpenAI O1 Alternative)」というものがある。   このサンプルがどういうものか、未だに自分でも解けない以下の問題をためしに聞いてみることにした。 『人類の...