首頁 > 軟體

pycharm中keras匯入報錯無法自動補全cannot find reference分析

2022-07-03 14:00:08

引言

目前無論是中文還是國外網站對於如何正確的匯入keras,如何從tensorflow中匯入keras,如何在pycharm中從tensorflow裡匯入keras,這幾個問題都眾說紛紜,往往是互相借鑑給出一個可用的解決方法,但沒有更進一步的解釋了。常見因為keras匯入引發的問題有以下幾個:

  • from tensorflow import keras: pycharm中使用keras相關的包沒有自動補全
  • from tensorflow.keras.layers import Conv2D: pycharm中如此匯入會發生Cannot find reference 'keras' in '__init__.py | __init__.py' 問題。

分析

首先需要說明的是上面兩種問題其實並不能稱之為“問題”,因為實際上這些程式碼都是可以執行的,並且如果在pycharm自帶的python console裡執行這些問題也都是不存在的, 只是由於編譯器自帶的bug5使得這些現象一再發生。如果您只是要求程式碼能執行即可,那可以關閉頁面大膽的繼續程式設計了,但要是想要解決這些不便,可以繼續看下去。

解決方法

首先給出這些問題的解決方法

使用如下方式匯入keras:

from tensorflow.python import keras

不從tensorflow裡匯入keras:

import keras

不匯入keras,改用tf.keras.xxx來使用keras的相關函數;

理論解釋

首先我們要明確一個概念,keras只是一個前端的API,其後端的計算都要基於現有的計算引擎,比如Theano或者Tensorflow1,而如今Tensorflow已經成為了Keras的預設後端,後者也成為了前者的官方高階API,也就意味著當我們安裝2.0+版本的Tensorflow時實際會自動安裝Keras2,經筆者實測也確實如此。

 那麼當我們通過不同方式來匯入keras時,我們到底在匯入什麼,不同匯入方法匯入的包是否有區別呢?以下分別通過包的匯入路徑及匯入內容進行具體分析,為了更好理解其中內容,建議去學習python中import的相關知識3.

keras常用匯入方法有以下幾種:

import keras
from tensorflow import keras
from tensorflow.python import keras
import tensorflow as tf
tf.keras

1. 直接匯入keras

定址到的包為venvLibsite-packageskeras__init__.py,也就是找到了keras的安裝路徑,直接執行了__init__.py。但是keras這個包的init檔案中並沒有顯式的匯入keras包中的所有子包,只是顯式匯入了一部分比如Sequetial ,Model:

from keras import models
from keras.engine.input_layer import Input
from keras.engine.sequential import Sequential
from keras.engine.training import Model

在僅匯入keras的情況下,pycharm視窗中我們無法使用其他的程式碼自動補全,比如keras.optimizers等等。但值得注意的是,剛剛我說的是沒有“顯式匯入”,而實際上顯式匯入的這些py檔案本身其實又匯入了大部分keras所包含的函數,這就使得雖然我們寫出keras.optimizers這樣的語句在pycharm中無法不全、高亮,但執行起來是沒有問題的,而在python console中執行也能夠自動補全,其實這也算是pycharm的一個bug了。如果希望在視窗介面也能自動補全,就應該直接匯入keras資料夾下的optimizer子資料夾:import keras.optimizer

2. 從tensorflow裡匯入keras

這一方法是執行了venvLibsite-packagestensorflow__init__.py,而該檔案中的keras實際是從 keras.api._v2 中匯入了keras,執行了venvLibsite-packageskerasapi_v2keras_init.py,而再進一步的檢視它實際也只是個空殼,進一步的呼叫了venvLibsite-packageskerasapi_v2keras資料夾下的其他子資料夾,雖然這些資料夾看起來十分唬人,和重寫了所有方法一樣,但實際上其下只包含著__init__檔案,內容也只是from keras import xx,和1中的方沒有區別,只是個重定位而已。因此我們可以推測,在2.0+的版本里使用tf.keras.xxkeras.xx實際上是等價的,而在以前的版本是否存在區別,亦或者獨立安裝的keras是否有區別,筆者尚未去證實。

3. 從tensorflow.python裡匯入keras;

執行了venvLibsite-packagestensorflowpythonkeras__init__.py,這裡的keras下包含了第一二種方法裡匯入的keras下屬函數,是對1、2中方法的重寫而不是重定位。tf.python.keras是private的,提供給開發者使用的,並不建議普通使用者來使用。

4. 不匯入keras

這一方法和2是等價的,不同點在於在pycharm中使用這種方式書寫可以實現程式碼的自動補全。

總結

這篇報錯處理花了挺長時間去搜集相關資料並且實際驗證,最終弄明白了python的import原理和keras到底是以怎樣的形式和tensorflow取得聯絡,也算是個挺大的收穫,總結就是後續的程式碼直接import keras即可。當然還有一些不太明晰的地方,比如tf.python.keras和keras在通用函數的實現方面方面是否存在區別,又有著怎樣的區別?

到此這篇關於pycharm中keras匯入報錯無法自動補全cannot find reference分析的文章就介紹到這了,更多相關pycharm keras 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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