‘GridEnv‘ object has no attribute ‘unwrapped‘问题的解决

目录

背景:

如何解决:

思路:

后记:


背景:

        在郭宪老师的《深入浅出强化学习:原理入门》的学习中,在编写机器人找金币环境的最后一步中,出现了这样的问题:AttributeError: 'GridEnv' object has no attribute 'unwrapped'

        以下是错误报告:

Traceback (most recent call last):
  File "Z:\DQN\02\ending.py", line 5, in 
    env = gym.make('GridWorld-v0')
  File "Z:\Anaconda3\envs\my_env\lib\site-packages\gym\envs\registration.py", line 235, in make
    return registry.make(id, **kwargs)
  File "Z:\Anaconda3\envs\my_env\lib\site-packages\gym\envs\registration.py", line 129, in make
    env = spec.make(**kwargs)
  File "Z:\Anaconda3\envs\my_env\lib\site-packages\gym\envs\registration.py", line 95, in make
    env.unwrapped.spec = spec
AttributeError: 'GridEnv' object has no attribute 'unwrapped'

Process finished with exit code 1

如何解决:

        先说我是怎么解决的,再说解决的思路

        问题出在

class GridEnv:

        这个类的定义处,将他改成

class GridEnv(gym.Env):

        就可以了

思路:

        首先报错的翻译:'GridEnv'类没有对象'unwrapped'。这边python太久没有用,很多语法都不记得了。

        在看到这个问题的第一反应,是去看出错位置的代码,registration.py的95行定义的是make函数(在这里的第22行)

def make(self, **kwargs):
    """Instantiates an instance of the environment with appropriate kwargs"""
    if self.entry_point is None:
        raise error.Error(
            "Attempting to make deprecated env {}. (HINT: is there a newer registered version of this env?)".format(
                self.id
            )
        )

    _kwargs = self._kwargs.copy()
    _kwargs.update(kwargs)

    if callable(self.entry_point):
        env = self.entry_point(**_kwargs)
    else:
        cls = load(self.entry_point)
        env = cls(**_kwargs)

    # Make the environment aware of which spec it came from.
    spec = copy.deepcopy(self)
    spec._kwargs = _kwargs
    env.unwrapped.spec = spec#这里是95行
    if env.spec.max_episode_steps is not None:
        from gym.wrappers.time_limit import TimeLimit

        env = TimeLimit(env, max_episode_steps=env.spec.max_episode_steps)
    else:
        if self.order_enforce:
            from gym.wrappers.order_enforcing import OrderEnforcing

            env = OrderEnforcing(env)
    return env

        从上往下看到95行,发现这是make函数第一次调用env.unwrapped,而这也是整个程序第一次调用env。那么问题来了,是env没有这个对象还是说有其他问题呢?于是我去看了env的定义:

@property
def unwrapped(self):
    return self.env.unwrapped

        在三百多行代码中,我找到了这个,env是有unwrapped这个对象的,那么就不是这个问题了,那其他问题从哪里找起呢?陷入了僵局。

        灵机一动,还有其他样例代码,去看看其他环境是如何写出来的不就知道了吗?然后我发现了这个

class CartPoleEnv(gym.Env):

        原来是我自己定义错了,在狠狠的抽了自己两巴掌之后,结束了这次的debug,之后虽然有一些小bug,但都很快解决了。

后记:

        除了这个bug,还有一些配置环境的时候出现的问题,但是在足够多的网页的查找下,最终还是找到了解决方案,总结主要有三点:

  1. 书上参考的资料(GitHub)一定要去看,看了很快就能知道问题所在。
  2. 各种步骤要循规蹈矩的来,最好不要跳步骤或和在其他教程一起串着看,早晚出问题。
  3. 外网解决资源很丰富,可以尝试在StackOverflow上寻找答案(中间有一个很重要的启发点就是来自StackOverflow)

        看了gym的一些东西的内部实现之后,感觉功力大涨,下次也可以试试看一些东西的内部实现。

你可能感兴趣的:(强化学习的学习,小问题的解决,强化学习)