網站首頁 編程語言 正文
問題導出
為了更方便地實現自己的一些想法,我最終還是向OpenAI的baselines屈服了,因為自己的一些實現總是難與各大論文給出的結果進行對比。于是我今天安裝了baselines,其中還是有一些坑的,這里主要介紹在安裝完成之后,運行示例時cartpole.py所遇到的坑,它叫做ImportError。
ImportError
我們先cd到文件夾baselines/baselines/deepq/experiments下,然后運行下面語句:
$ python3 train_cartpole.py
然后就報錯了……
從圖中我們可以看出,在文件train_cartpole.py中有如下語句:
from baselines import deepq
而在我們導入deepq的時候,將會執行deepq文件夾下的__init__.py文件,于是我們打開這一文件:
from baselines.deepq import models # noqa
from baselines.deepq.build_graph import build_act, build_train # noqa
from baselines.deepq.simple import learn, load # noqa
from baselines.deepq.replay_buffer import ReplayBuffer, PrioritizedReplayBuffer # noqa
def wrap_atari_dqn(env):
from baselines.common.atari_wrappers import wrap_deepmind
return wrap_deepmind(env, fram_stack=True, scale=True)
在報錯中,提到了上面的這一語句:
from baselines.deepq.simple import learn, load # noqa
同時,報錯中提到,在simple.py中有:
from baselines import deepq
問題漸漸明朗了,在我們import deepq的時候,將要執行__init__.py文件,這個文件將會從simple.py中把learn和load導入到deepq的命名空間下。而simple.py又想要import deepq,這也就構成了所謂的“Looping Import”。那我們應該如何解決呢?
我們先將simple.py中的下面這條語句注釋掉:
from baselines import deepq
然后運行:
$ python3 train_cartpole.py
發現又出錯了:
不過這個錯誤是肯定會出的,我們無緣無故注釋掉了人家寫的一個import語句,能不錯嘛。不過不要慌,我們繼續分析,為什么這里要import deepq呢?就是為了執行下面的語句:
act = deepq.build_act(**act_params)
...
act, train, update_target, debug = deepq.build_train(...)
這里因為我們在__init__.py中將build_act和build_train方法導入到了deepq的命名空間下,所以這里可以直接在deepq的命名空間中去調用build_act和build_action。
如果我們要在simple.py文件中使用deepq.build_act的話,那么必然要在simple.py中導入deepq,而且也需要在__init__.py中導入simple,這么一來,就會出現“Looping Import”問題了。
解決方案
所以我們選擇的解決方案是:
a) 將__init__.py中的下列語句注釋掉:
from baselines.deepq.build_graph import build_act, build_train # noqa
b) 將simple.py中的下列語句換掉:
from baselines import deepq
換為:
from baselines.deepq.build_graph import build_act, build_train
c) 修改下列語句:
act = deepq.build_act(**act_params)
...
act, train, update_target, debug = deepq.build_train(...)
改為:
act = build_act(**act_params)
...
act, train, update_target, debug = build_train(...)
d) 運行:
$ python3 train_cartpole.py
OK,問題解決。
對了,在OpenAI Baselines里面,有一些代碼用到了Python3.6的特性,比如直接(None, *tuple),這在Python3.4是不允許的,所以建議大家直接安裝conda環境,并裝好Python3.6。
原文鏈接:https://blog.csdn.net/u013745804/article/details/79552472
相關推薦
- 2022-06-15 golang?gorm模型結構體的定義示例_Golang
- 2022-04-10 關于C#中GUI編程的標準事件問題_C#教程
- 2023-04-19 C++11新特性之四種類型轉換cast說明_C 語言
- 2023-07-15 前后端交互,前端參數格式form-data
- 2022-06-20 Flutter路由守衛攔截的實現_Android
- 2023-02-14 一文帶你搞懂Golang依賴注入的設計與實現_Golang
- 2022-08-03 Android開發手冊自定義Switch開關按鈕控件_Android
- 2022-08-10 C#結束進程及子進程_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支