化学系エンジニアがAIを学ぶ

PyTorchでディープラーニング、強化学習を学び、主に化学工学の問題に取り組みます

OpenAI Gym 基本的な使い方のメモ

はじめに

すぐに使い方を忘れてネットで調べているので、基本的な使い方をメモしておく。ObservationWrapperの使用例も記載する。

基本的な使い方

CartPole

環境の構築(環境インスタンス生成)

import gym
env = gym.make("CartPole-v0")

環境の初期化。観測値が返る

env.reset()
>>> array([ 0.01308375, -0.00076966,  0.03593438, -0.04269914])

actionの数の確認

env.action_space 
>>> Discrete(2)  # Discrete型

env.action_space.n
>>> 2  # 数値で取り出せる

actionをランダムサンプリング

env.action_space.sample()
>>> 0

observation_spaceの型、上下限値、(次元)、数値型

env.observation_space
>>> Box(-3.4028234663852886e+38, 3.4028234663852886e+38, (4,), float32)

observation_spaceの次元の数を数値で得る

env.observation_space.shape[0]
>>> 4

observation をランダムサンプリング

env.observation_space.sample()
>>> array([ 3.4541728e+00, -2.6457083e+38, -2.0181824e-01, -5.4519964e+37], dtype=float32)

環境に対しactionし、その後の観測値、報酬、終了判定フラグ、追加情報 を得る

action = 0
env.step(action)
>>> (array([ 0.01306835, -0.19638798,  0.0350804 ,  0.26110135]), 1.0, False, {})

FrozenLake

環境の構築と初期化

env = gym.make("FrozenLake-v0")
env.reset()
>>> 0  # 観測値は数値1つ

action_space と observation_space

env.action_space
>>> Discrete(4)

env.observation_space
>>> Discrete(16)  # 観測値はDiscrete型

ObservationWrapper

FrozenLakeのobservation_spaceはDiscrete型で0 - 15の数値が1つ返るが、これをOne-hotにエンコーディングしたいときにObservationWrapperを利用すると便利である。

参考: Deep-Reinforcement-Learning-Hands-On-Second-Edition/02_frozenlake_naive.py at master · PacktPublishing/Deep-Reinforcement-Learning-Hands-On-Second-Edition · GitHub

observation_spaceをOne-hotなBox型に変えるWrapper

import gym.spaces
import numpy as np

class OneHotWrapper(gym.ObservationWrapper):
    def __init__(self, env):
        super(OneHotWrapper, self).__init__(env)
        shape = (env.observation_space.n,)
        self.observation_space = gym.spaces.Box(0.0, 1.0, shape, dtype=np.float32)
    
    def observation(self, observation):
        res = np.copy(self.observation_space.low)  # 観測データの最小値を取る、つまり 0
        res[observation] = 1.0
        return res

環境の構築と初期化、および環境へのaction実施。観測値がOne-hotになっている

env_oh = OneHotWrapper(gym.make("FrozenLake-v0"))
env_oh.reset()
>>> array([1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
           dtype=float32)

action = 1
env_oh.step(action)
>>> (array([0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       dtype=float32),
       0.0,
       False,
       {'prob': 0.3333333333333333})