TF-Agents自定义微电网环境utils.validate_py_environment校验失败问题
问题原因
校验失败的核心原因是返回的TimeStep字段维度和你定义的spec不匹配,具体有两处错误:
- reset返回的观测值维度错误:你在
_reset方法中用np.array([self._state])生成观测,多套了一层数组,得到的是shape为(1,4)的二维数组,但你的observation_spec定义的观测shape是(4,)的一维数组,二者不匹配。 - 终止状态返回的奖励维度错误:episode终止时你生成的reward是
np.array([self._state[0] - self._state[3]],带了多余的数组包裹,得到的是shape为(1,)的一维数组,和spec要求的标量(shape为())不匹配,同时会连带导致discount因子也变成错误的一维数组格式。
修复方案
修改MicroGridEnv类的两个方法即可:
def _reset(self): self._state = [0.0, 0.0, 0.0, 0.0] self._episode_ended = False # 去掉外层多余的[],生成shape为(4,)的一维数组 return ts.restart(np.array(self._state, dtype=np.float32)) def _step(self, action): # 其余代码保持不变,仅修改终止时的reward生成逻辑 if self._episode_ended: # 去掉外层多余的[],生成标量格式的reward reward = np.array(self._state[0] - self._state[3], dtype=np.float32) return ts.termination( self._state, reward ) else: return ts.transition( self._state, reward=0 )
修改完成后重新运行,utils.validate_py_environment即可正常通过校验。
内容的提问来源于stack exchange,提问作者EVilchesM
相关产品推荐
相关产品推荐

