baselines示例程序train_cartpole.py的ImportError
問題導出
為瞭更方便地實現自己的一些想法,我最終還是向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。
以上就是baselines示例程序train_cartpole.py的ImportError的詳細內容,更多關於train_cartpole.py的ImportError的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 人工智能深度學習OpenAI baselines的使用方法
- 淺談tf.train.Saver()與tf.train.import_meta_graph的要點
- python基於numpy的線性回歸
- 使用Python和scikit-learn創建混淆矩陣的示例詳解
- python機器學習樸素貝葉斯算法及模型的選擇和調優詳解