gymnasium obs_space errors

gymnasium 쓰기 어렵다 어려워

  1. keyword

    gym, gymnasium, pytorch, ray, rllib

  2. 싱글 에이전트 기준

    • 가위바위보나 스타크래프트 같은 맞짱까는 형태의 멀티 에이전트에선 어떻게 되는지 확인 안해봄
  3. 사실 전부 RTFM 얘기라서 특별한 내용은 아니다.

1. array(123, dtype=float32) 은 array([123], dtype=float32) 과 다르다

당연한 얘기지만 array(123) 은 0d array (value only) 이고, array([123])은 1d array이다.

x = np.array(123)
print(x[0])
# error

고로 gym(=gymnasium)에서 space를 설정할때에

Box(low=0.0, high=1.0, shape=(), dtype=np.float32)

Box(low=0.0, high=1.0, shape=(1,), dtype=np.float32) 는 다르다.

def __init__(...):
observation_space = Box(low=0.0, high=1.0, shape=(1,), dtype=np.float32)


def reset(...):
    return state, info

obs가 (1, ) 라면 state로는 array([123])을 받아야한다

obs가 () 라면 state는 array(123)을 받아야한다. (혹은 python float도 가능, 알아서 변환해준다)

이 경우 대충 다음과 같은 에러가 뜬다

ValueError: Observation () outside given space ()!

2. reward는 0d로 주는게 좋다.

Task가 멀티 태스크가 아닌경우 reward는 0d로 주는게 좋다. (반박시 내가 틀림)

다음과 같이 3가지 경우를 생각해볼수 있다.

  1. 1d로 주는 경우

    • 트레이닝시에 에러가 난다.

      대부분 [B, T] 로 배치가 들어오지만 이 경우 [B, T, 1] 으로 들어오는 경우가 생겨서 에러가 뜬다.

      assert rho_rank == len(rewards.size())
           
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
           
      AssertionError
      
  2. 1d, 0d 쓰까로 주는 경우

    • 길이가 다른 list를 하나의 array로 합치는 경우 처럼 Value error가 뜬다.

      타입을 보면 [np.float64, np.float64, np.ndarray, np.ndarray, …]

      위와 같이 구성되어 있는 경우에 발생한다.

       cache_dict[key] = [_to_float_np_array(d) for d in self.buffers[key]]
           
       ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was () + inhomogeneous part.
      
  3. 0d로 주는경우

    • 나는 능지가 후달려서 그냥 0d로 주기로 결정하였다.