1

我已经使用gym.Env 作为父类制作了一个自定义环境,并且在单核运行时一切正常。我已经开始如下代码:

class MyEnv(gym.Env):
....

但是,如果我尝试使用 SubprocVecEnv 来使用我所有的 24 个 CPU 内核来加速学习过程,我会收到消息: ValueError: could not broadcast input array from shape (24,24) into shape (24,1)

我已经测试了 DummyVecEnv,它运行良好,但由于此功能不允许多处理,我想像通常使用 Atari/Gym 环境一样使用 SubprocVecEnv。

PS:我的自定义环境非常简单,基本上我使用的是一个有 567 行和 4 列的数据集,代理一次访问一行并从这个观察中预测两个值。观察空间和动作空间如下:

self.observation_space = spaces.Box(low=1, high=1, shape=(1,4), dtype=np.float64)

self.action_space = spaces.Box(low=np.array([0., -1.]), high=np.array([2., 1.]), dtype=np.float64)

我像往常一样使用稳定基线的 PPO2 训练代理。

我错过了什么重要的东西吗?

4

1 回答 1

0

检查此示例代码:

import numpy as np
import gym
from baselines.common.vec_env.subproc_vec_env import SubprocVecEnv

env_name = 'your-env-name'
nproc = 8
T=10

def make_env(env_id, seed):
    def _f():
        env = gym.make(env_id)
        env.seed(seed)
        return env
    return _f

envs= [make_env(env_name, seed) for seed in range(nproc)]

envs = SubprocVecEnv(envs)

Xt = envs.reset()

for t in range(T):
    ut = np.stack([envs.action_space.sample() for _ in range(nproc)])
    xtpl, rt, done, info = envs.step(ut)
于 2021-02-17T10:14:54.917 回答