OpenAI Gym - 如何创建单热观察 space?
OpenAI Gym - How to create one-hot observation space?
除了 openAI's doc,我没能找到更详细的文档。
我需要知道正确的创建方法:
一个动作 space 有 1..n
个可能的动作。 (当前使用离散操作 space)
具有 2^n
状态的观察 space - 已采取的所有可能的操作组合的状态。
我想要一个动作向量的一次性表示 - action was already taken
为 1,action still hadn't been taken
为 0
如何使用 openAI 的 Gym 做到这一点?
谢谢
None 的 gym.Spaces
由 gym
包在撰写本文时提供,可用于镜像单一热编码表示。
幸运的是,我们可以通过创建 gym.Spaces
的子 class 来定义我们自己的 space。
我做了这样一个class,可能是你需要的:
import gym
import numpy as np
class OneHotEncoding(gym.Space):
"""
{0,...,1,...,0}
Example usage:
self.observation_space = OneHotEncoding(size=4)
"""
def __init__(self, size=None):
assert isinstance(size, int) and size > 0
self.size = size
gym.Space.__init__(self, (), np.int64)
def sample(self):
one_hot_vector = np.zeros(self.size)
one_hot_vector[np.random.randint(self.size)] = 1
return one_hot_vector
def contains(self, x):
if isinstance(x, (list, tuple, np.ndarray)):
number_of_zeros = list(x).contains(0)
number_of_ones = list(x).contains(1)
return (number_of_zeros == (self.size - 1)) and (number_of_ones == 1)
else:
return False
def __repr__(self):
return "OneHotEncoding(%d)" % self.size
def __eq__(self, other):
return self.size == other.size
你可以这样使用:
-> space = OneHotEncoding(size=3)
-> space.sample()
array([0., 1., 0.])
-> space.sample()
array([1., 0., 0.])
-> space.sample()
array([0., 0., 1.])
希望能帮到你
您要求的"multi one hot"space已经实现
https://github.com/openai/gym/blob/master/gym/spaces/multi_binary.py
import gym
# create a MultiBinary Space
# by passing n=10, each sample will contain 10 elements
mb = gym.spaces.MultiBinary(n=10)
mb.sample()
# array([1, 0, 1, 0, 0, 0, 0, 0, 0, 1], dtype=int8)
如果您想自己实现以确保在调用 sample
时不超过 x 个正元素,您可以选择 x 从 n 选项中随机索引,然后在所有 0
的数组中翻转这些索引,然后 return 那个。
除了 openAI's doc,我没能找到更详细的文档。
我需要知道正确的创建方法:
一个动作 space 有
1..n
个可能的动作。 (当前使用离散操作 space)具有
2^n
状态的观察 space - 已采取的所有可能的操作组合的状态。 我想要一个动作向量的一次性表示 -action was already taken
为 1,action still hadn't been taken
为 0
如何使用 openAI 的 Gym 做到这一点?
谢谢
None 的 gym.Spaces
由 gym
包在撰写本文时提供,可用于镜像单一热编码表示。
幸运的是,我们可以通过创建 gym.Spaces
的子 class 来定义我们自己的 space。
我做了这样一个class,可能是你需要的:
import gym
import numpy as np
class OneHotEncoding(gym.Space):
"""
{0,...,1,...,0}
Example usage:
self.observation_space = OneHotEncoding(size=4)
"""
def __init__(self, size=None):
assert isinstance(size, int) and size > 0
self.size = size
gym.Space.__init__(self, (), np.int64)
def sample(self):
one_hot_vector = np.zeros(self.size)
one_hot_vector[np.random.randint(self.size)] = 1
return one_hot_vector
def contains(self, x):
if isinstance(x, (list, tuple, np.ndarray)):
number_of_zeros = list(x).contains(0)
number_of_ones = list(x).contains(1)
return (number_of_zeros == (self.size - 1)) and (number_of_ones == 1)
else:
return False
def __repr__(self):
return "OneHotEncoding(%d)" % self.size
def __eq__(self, other):
return self.size == other.size
你可以这样使用:
-> space = OneHotEncoding(size=3)
-> space.sample()
array([0., 1., 0.])
-> space.sample()
array([1., 0., 0.])
-> space.sample()
array([0., 0., 1.])
希望能帮到你
您要求的"multi one hot"space已经实现
https://github.com/openai/gym/blob/master/gym/spaces/multi_binary.py
import gym
# create a MultiBinary Space
# by passing n=10, each sample will contain 10 elements
mb = gym.spaces.MultiBinary(n=10)
mb.sample()
# array([1, 0, 1, 0, 0, 0, 0, 0, 0, 1], dtype=int8)
如果您想自己实现以确保在调用 sample
时不超过 x 个正元素,您可以选择 x 从 n 选项中随机索引,然后在所有 0
的数组中翻转这些索引,然后 return 那个。