參考:
- 官方連結:Gym documentation | Make your own custom environment
- 騰訊雲 | OpenAI Gym 中級教程——環境定製與建立
- 知乎 | 如何在 Gym 中註冊自定義環境?
- g,寫完了才發現自己曾經寫過一篇:RL 基礎 | 如何搭建自定義 gym 環境
(這篇部落格適用於 gym 的介面,gymnasium 介面也差不多,只需詳細看看介面定義 魔改一下即可)
安裝 openai gym:
# pip install gym
import gym
from gym import spaces
需實現兩個主要功能:
env.__init__()
和obs = env.reset()
函式;obs, reward, done, info = env.step(action)
函式。
01 env 的初始化與 reset
env.__init__()
函式:
- 輸入是 env 的一些初始化條件,比如環境的地圖多大、環境裡有多少個金幣以及每個金幣的位置。如果只訓練一個特定的任務,比如在 3×3 地圖中吃右上角的一個金幣,則這些設定都可以寫死,不需要在 env 初始化時傳遞引數。
- 在
env.__init__()
函式中,需要定義self.observation_space
和self.action_space
。- 如果狀態空間 / 動作空間是離散的,則使用
spaces.Discrete([space dim])
; - 如果是連續的,則使用
spaces.Box(low=np.array([0,1]), high=np.array([100,50]), dtype=np.float32)
,其中 low high 都要符合狀態空間 / 動作空間的維度,分別代表每一維的最大最小值。 - 連續空間也可以使用
spaces.Box(low=0, high=255, shape=(84, 84), dtype=np.uint8)
這種形式,其中空間的每個維度具有相同的最大最小值,shape 表示空間的維度。 gym.spaces
的具體使用:官方文件 Gym documentation | Spaces , 知乎 | Gym 中 Spaces 淺入淺出的理解 。
- 如果狀態空間 / 動作空間是離散的,則使用
- 可以在
env.__init__()
函式的最後呼叫一下env.reset()
函式。
obs = env.reset()
函式:
- 作用是初始化環境,比如把 agent 放到地圖左下角,金幣放在地圖右上角,內建的計步器 reset 到 0 之類。
- 它的返回值 obs,應該是一個與狀態空間維度相同的 np.ndarray。
02 與環境互動的 step 函式
obs, reward, done, info = env.step(action)
函式:
- 輸入 action,應該是一個與動作空間維度相同的 np.ndarray。(一般的環境應該不支援批次輸入 action,即
action.shape = (batch_size, action_dim)
) - step 函式被用在 agent 與 env 的互動;env 接收到輸入的動作 action 後,內部進行一些狀態轉移,輸出:
- 新的狀態 obs:與狀態空間維度相同的 np.ndarray;
- reward:獎勵值,實數;
- done:bool 值,True 代表這個 episode 已經跑完(比如 agent 吃到了金幣,或 agent 已經走完了 1000 步)(此時該 reset 了),False 則代表這個 episode 還沒跑完。
- info:python 的字典(dict),可以傳遞一些資訊,沒有資訊傳遞則可以設成
{}
。
03 高階用法
env.__init__(render_mode="human" or "rgb_array")
以及rgb_frame = env.render()
。render mode = human 好像可以使用 pygame,rgb frame 則是直接輸出(比如說)shape = (256, 256, 3) 的 frame,可以用 imageio 儲存成影片。- 如何註冊 gym 環境:RL 基礎 | 如何註冊自定義 gym 環境