gymnasium 쓰기 어렵다 어려워
-
keyword
gym, gymnasium, pytorch, ray, rllib
-
싱글 에이전트 기준
- 가위바위보나 스타크래프트 같은 맞짱까는 형태의 멀티 에이전트에선 어떻게 되는지 확인 안해봄
-
사실 전부 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가지 경우를 생각해볼수 있다.
-
1d로 주는 경우
-
트레이닝시에 에러가 난다.
대부분 [B, T] 로 배치가 들어오지만 이 경우 [B, T, 1] 으로 들어오는 경우가 생겨서 에러가 뜬다.
assert rho_rank == len(rewards.size()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AssertionError
-
-
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.
-
-
0d로 주는경우
- 나는 능지가 후달려서 그냥 0d로 주기로 결정하였다.