首頁 > 軟體

baselines範例程式train_cartpole.py的ImportError

2022-05-20 16:00:08

問題匯出

為了更方便地實現自己的一些想法,我最終還是向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的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com