'GridEnv' object has no attribute 'unwrapped'问题的解决
背景:
在郭宪老师的《深入浅出强化学习:原理入门》的学习中,在编写机器人找金币环境的最后一步中,出现了这样的问题:AttributeError: 'GridEnv' object has no attribute 'unwrapped'
以下是错误报告:
1 Traceback (most recent call last): 2 File "Z:\DQN\02\ending.py", line 7, in <module> 3 env = gym.make('GridWorld-v0') 4 File "Z:\Anaconda3\envs\my_env\lib\site-packages\gym\envs\registration.py", line 235, in make 5 return registry.make(id, **kwargs) 6 File "Z:\Anaconda3\envs\my_env\lib\site-packages\gym\envs\registration.py", line 129, in make 7 env = spec.make(**kwargs) 8 File "Z:\Anaconda3\envs\my_env\lib\site-packages\gym\envs\registration.py", line 95, in make 9 env.unwrapped.spec = spec 10 AttributeError: 'GridEnv' object has no attribute 'unwrapped' 11 12 Process finished with exit code 1
如何解决:
先说我是怎么解决的,再说解决的思路
问题出在
1 class GridEnv:
这个类的定义处,将他改成
1 class GridEnv(gym.Env):
就可以了
思路:
首先报错的翻译:'GridEnv'类没有对象'unwrapped',这边python太久没有用,很多语法都不记得了。
在看到这个问题的第一反应,是去看出错位置的代码,registration.py的95行定义的是make函数
1 def make(self, **kwargs): 2 """Instantiates an instance of the environment with appropriate kwargs""" 3 if self.entry_point is None: 4 raise error.Error( 5 "Attempting to make deprecated env {}. (HINT: is there a newer registered version of this env?)".format( 6 self.id 7 ) 8 ) 9 10 _kwargs = self._kwargs.copy() 11 _kwargs.update(kwargs) 12 13 if callable(self.entry_point): 14 env = self.entry_point(**_kwargs) 15 else: 16 cls = load(self.entry_point) 17 env = cls(**_kwargs) 18 19 # Make the environment aware of which spec it came from. 20 spec = copy.deepcopy(self) 21 spec._kwargs = _kwargs 22 env.unwrapped.spec = spec#这里是95行 23 if env.spec.max_episode_steps is not None: 24 from gym.wrappers.time_limit import TimeLimit 25 26 env = TimeLimit(env, max_episode_steps=env.spec.max_episode_steps) 27 else: 28 if self.order_enforce: 29 from gym.wrappers.order_enforcing import OrderEnforcing 30 31 env = OrderEnforcing(env) 32 return env
从上往下看到95行,发现这是make函数第一次调用env.unwrapped,而这也是整个程序第一次调用env。那么问题来了,是env没有这个对象还是说有其他问题呢?于是我去看了env的定义:
1 @property 2 def unwrapped(self): 3 return self.env.unwrapped
在三百多行代码中,我找到了这个,env是有unwrapped这个对象的,那么就不是这个问题了,那其他问题从哪里找起呢?陷入了僵局。
灵机一动,还有其他样例代码,去看看其他环境是如何写出来的不就知道了吗?然后我发现了这个
1 class CartPoleEnv(gym.Env):
原来是我自己定义错了,在狠狠的抽了自己两巴掌之后,结束了这次的debug,之后虽然有一些小bug,但都很快解决了。
后记:
除了这个bug,还有一些配置环境的时候出现的问题,但是在足够多的网页的查找下,最终还是找到了解决方案,总结主要有三点:
1、书上参考的资料(GitHub)一定要去看,看了很快就能知道问题所在。
2、各种步骤要循规蹈矩的来,最好不要跳步骤或和在其他教程一起串着看,早晚出问题。
3、外网解决资源很丰富,可以尝试在StackOverflow上寻找答案(中间有一个很重要的启发点就是来自StackOverflow)
看了gym的一些东西的内部实现之后,感觉功力大涨,下次也可以试试看一些东西的内部实现。
原文地址:https://www.cnblogs.com/AwakeFantasy/p/15840806.html
- linq to sql的多条件动态查询(上)
- 极简区块链手册:什么是区块链?什么是比特币?
- Nginx+keepalived实现高可用
- 来一波Linux中查看cpu、磁盘、内存、网络的命令
- PXE+kickstart网络安装CentOS7.4系统及过程中各种报错
- [MSDN]通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行
- Flask-配置与调试
- PXE+kickstart网络安装CentOS7.4系统及过程中各种报错
- MSDN官方的ASP.Net异步页面的经典示例代码
- Nginx反向代理、负载均衡功能
- 2018即将面临的12个云安全风险
- Flask快速入门,知识整理
- python的reduce()函数
- 企业级memcached缓存数据库结合php使用与web管理memcached
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python3 webservice接口测试代码详解
- php往mysql中批量插入数据实例教程
- PHP类与对象后期静态绑定操作实例详解
- PHP后期静态绑定之self::限制实例分析
- PHP获取星期几的常用方法小结
- PyTorch-GPU加速实例
- Spring @Enable模块驱动原理及使用实例
- 关于python的缩进规则的知识点详解
- php 处理png图片白色背景色改为透明色的实例代码
- PHP设计模式之模板模式定义与用法详解
- yii2 url重写并隐藏index.php方法
- PHP设计模式之模板方法模式实例浅析
- keras 自定义loss model.add_loss的使用详解
- keras做CNN的训练误差loss的下降操作
- Python基于yaml文件配置logging日志过程解析