gpt4 book ai didi

deep-learning - 在健身房自定义环境中定义观察空间时出错

转载 作者:行者123 更新时间:2023-12-05 05:43:53 29 4
gpt4 key购买 nike

我正在研究一种强化算法,我对此很陌生,并试图掌握一些东西。

Player1Env 查看 7x6 Connect4 游戏网格。我按如下方式初始化类:

def __init__(self):
super(Player1Env, self).__init__()
self.action_space = spaces.Discrete(7)
self.observation_space = spaces.Box(low=-1, high=1, shape=(7, 6), dtype=np.float32)

检查类是否被正确实例化

env = Player1Env()
check_env(env)

返回错误

AssertionError: The observation returned by the `reset()` method does not match the given observation space

打印重置函数返回的观察值及其形状:

[[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]]
(7, 6)

low 和 high 分别定义为 -1 和 1,因为网格代表当前的棋盘状态,其中 1 是玩家 1 投入的石头,-1 是玩家 2 投入的石头。这部分代码已被广泛测试,但即使将边界更改为 -np.infnp.inf 也不会更改错误消息。

重置函数本身:

def reset(self):
self.board = np.zeros((7, 6))
self.player = 1

self.reward = 0
self.done = False

observation = self.board

return observation

步进函数将 rl 算法与预编程的代理进行对比,但无论如何错误应该来自重置函数。

你能帮我看看错误是从哪里来的吗?

编辑:numpy API 编译错误版本时出现 UserError,似乎不会影响可用性(一切都在预制健身房环境中工作)。我设法修复了该错误,但观察空间定义问题仍然存在。

最佳答案

您的解决方案:

如果你在 reset() 中定义 self.board 如下你的问题就解决了:

self.board = np.zeros((7, 6), dtype=np.float32)

答案末尾提供了更多详细信息和示例


一般答案:健身房中带有 Box 观察空间的自定义环境的最小示例

boxobservation 中的

dtype 应该相同。这里两者都被认为是 float32

from gym import Env
from gym.utils.env_checker import check_env

class CustomEnv(Env):
def __init__(self):
self.action_space = Box(low=np.array([0.0]), high=np.array([1]))
self.observation_space = Box(low=np.array([0.0, 0.0]), high=np.array([1.0, 1.0]))
self.state = np.array([0.5, 0.5], dtype=np.float32)

def step(self, action):
state = self.state
# below variables should be defined in order to prevent error in check_env
reward = 1
done = False
info = {}
return self.state, reward, done, info

def reset(self):
self.state = np.array([0.5, 0.5], np.float32) # np.float32 is essential
return self.state
def render(self):
pass

env = CustomEnv()
check_env(env, warn=True)

关于 numpy 和 gym.spaces.Box dtype 的例子:

当您在 gym 中定义自定义 env 时,check_env 检查几项内容。在这种情况下,observation.isinstance(observation_space) 没有被传递。

在这种情况下,self.board(或名为 reset() 的方法中名为 observation 的变量)不是观察空间。因为 observation.dtype = float64observation_space.dtype = float32

numpy 对象中的默认 dtypefloat64Box 中的默认 dtype对象是 float32。版本:numpy 1.21.5,健身房 0.21.0

import nump as np
import gym
from gym.spaces import Box


# example 1; by this definition you get error
In [1]: observation_space = Box(low=np.array([0.0, 0.0]), high=np.array([1.0, 1.0]))
In [2]: observation = np.array([0.5, 0.5])
In [3]: print(observation.dtype)
In [4]: observatin_space.contains(observation) # does observation_space contains observation?

out[3]: float64
out[4]: False

# example 2; this definition works fine; no error
In [10]: observation_space_2 = Box(low=np.array([0.0, 0.0]), high=np.array([1.0, 1.0]))
In [11]: observation_2 = np.array([0.5, 0.5], dtype=np.float32)
In [12]: print(observation_2.dtype)
In [13]: observatin_space_2.contains(observation_2) # does observation_space contains observation?

out[12]: float32
out[13]: True

关于deep-learning - 在健身房自定义环境中定义观察空间时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71724442/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com