矢量化环境是一种将多重独立环境堆叠成单一环境的方法。相比于每步在单一环境上训练RL智体,矢量化环境允许我们每步在n个环境上训练RL智体。因为这个原因,传递给环境的actions是一个n维环境,观察、奖励和事件约束信号也是一样的。类似Dict或Tuple这种非数组观测空间的case中,不同子空间有不同形状,子观测值为n维向量。
Name | Box |
Discrete |
Dict |
Tuple |
Multi Processing |
---|---|---|---|---|---|
DummyVecEnv | ✔️ | ✔️ | ✔️ | ✔️ | ❌️ |
SubprocVecEnv | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
当使用包装器进行帧堆叠或标准化时就需要矢量化环境
当使用矢量化环境,环境会在每集结束后自动重置。因此,当done[i]为真时第i次环境返回的观测值就成为下一环节的初始观测值,而非刚结束这部分的最后观测值。你可访问“real”终止章节的最终观测值-那就是,伴随潜在环境提供的done事件,用
vecenv
返回的info
字典中terminal_observation
键@@@惨不忍睹,我也没太看懂,后续懂了再来修改
警告:
当使用
SubprocVecEnv
,用户如果用forkserver
或spawn
启动方法(Windows
中默认),需要将代码封装在if __name__=="__main__":
。在Linux
中,默认启动方法时fork
,并不是线程安全的,可以创建死锁。
-
VecEnv
class stable_baselines.common.vec_env.VecEnv(num_envs, observation_space, action_space)
抽象异步,矢量化环境。
参数:
- num_envs - (int)环境的数量
- observation_space - (Gym空间)观测空间
- action_space - (Gym空间)行动空间
函数:
-
close()
清理环境资源
-
env_method(method_name, *method_args, indices=None, **method_kwargs)
调用矢量化环境的实例方法。
参数 数据类型 意义 method_name 字符串 调用的环境方法 indices list,int 方法被调用的环境的索引 method_args tuple 调用中提供的任何位置参数 metho_kwargs dict 调用中提供的任何关键字参数 返回:环境的方法调用返回项的列表
-
get_attr(attr_name, indices=None)
从矢量化环境返回属性
参数 数据类型 意义 attr_name str 值被返回的那个属性的名字 indices list,int 从中获取属性的哪些环境的索引 返回:所有环境中"attr_name"值的列表
-
get_images()
从每个环境中返回RGB图像
-
getattr_depth_check(name, already_found)
检查属性引用是否隐藏在对
__getattr__
的递归调用中。参数 数据类型 意义 name str 需检查那个属性的名字 already_found bool 是否已在包装器中找到此属性 返回:(str or None)属性被隐藏的模型名字(如果有被隐藏的话)
-
render