Python繪製神經網路模型圖

2023-02-20 15:02:39

  本文介紹基於Python語言,對神經網路模型的結構進行視覺化繪圖的方法。

  最近需要進行神經網路結構模型的視覺化繪圖工作。查閱多種方法後,看到很多方法都比較麻煩,例如單純利用graphviz模組,就需要手動用DOT語言進行圖片描述,比較花時間;最終,發現利用第三方的ann_visualizer模組,可以實現對已有神經網路的直接視覺化,過程較為方便,本文對此加以詳細介紹。

  此外,如果需要在MATLAB中實現神經網路構建與簡單的視覺化,大家可以檢視MATLAB人工神經網路ANN程式碼;如果要藉助軟體或線上工具進行不需要程式碼的神經網路視覺化,可以檢視我們後期的部落格。

  相關環境的版本資訊:Anaconda Navigator1.10.0Python3.8.5

  首先,下載與安裝必要的模組ann_visualizer。開啟Anaconda Prompt (Soft)

  在彈出的介面中輸入:

pip install ann_visualizer

  即可完成ann_visualizer模組的安裝。

  接下來,我們就可以藉助以下僅僅一句程式碼對神經網路模型進行視覺化了。

ann_viz(DNNModel,view=True,filename='G:/CropYield/02_CodeAndMap/01_SavedPicture/MyANN.gv',title='ANN')

  其中,DNNModel就是我們已經建立好的神經網路模型,任意神經網路模型均可——可以是一個簡單的淺層人工神經網路,也可以是一個相對複雜的全連線深度神經網路view表示是否在程式碼執行後直接顯示繪圖結果;filename是繪圖結果的儲存位置,需要以.gv結尾;title就是神經網路圖片的名稱。

  在這裡,我就直接以Python TensorFlow深度神經網路迴歸:keras.Sequential中介紹並建立的深度神經網路加以視覺化。

  第一次執行程式碼時發現,出現以下報錯:

  報錯提示我沒有安裝graphviz模組,但其實之前在進行隨機森林決策樹的視覺化(也就是Python實現隨機森林RF並對比自變數的重要性)時,早已經將這一模組安裝過了,並且當時用到graphviz這一模組的程式碼也沒有報錯。通過查閱,發現這裡需要重新安裝一下python-graphviz這個新的模組。因此我們開啟Anaconda Prompt (Soft),輸入程式碼:

conda install python-graphviz

  如下圖所示:

  安裝之後這裡就不報錯啦~

  結果緊接著又報出了新的錯誤,說我的keras模組沒有安裝:

  這就不對了,明明在進行深度神經網路構建時都沒有出現問題,甚至在這一句報錯的下方連深度神經網路的誤差繪製曲線都能顯示(誤差曲線的精度的確很差,大家不用在意~因為這裡我們僅僅是做一個示範,所以Epoch次數就調得很小),說明keras模組應該是沒問題的。

  隨後考慮到,這裡報錯的keras是在ann_visualizer的檔案環境下,可能是環境不同導致的。開啟Anaconda Navigator,在base (root)環境下確實找不到keras

  那麼我這裡就圖方便,直接在base (root)環境下再安裝一個keras。安裝方法同上,輸入程式碼即可:

pip install keras

  然後這裡就不報錯啦~

  接下來,經過多次嘗試發現,這一方法進行神經網路視覺化時,一是不能存在正則化層與BatchNormalization層;二是LeakyReLU層與Dropout層的總數量不能過多,否則繪圖結果會出現問題——這就顯得這一視覺化方法稍微有點雞肋了,但是其對於基本的神經網路繪圖而言其實也已經很不錯了。因此,我就將Python TensorFlow深度神經網路迴歸:keras.Sequential中的神經網路上述對應的層刪除或註釋掉。

  如下圖,首先,將當初我的程式碼對應的LeakyReLU層與Dropout層註釋掉:

  然後執行程式碼,即可進行神經網路的視覺化。且繪製出的圖將會自動開啟在PDF閱讀軟體中,如下圖(版面有限,這裡就只是繪圖結果的一部分)。

  還是很不錯的~我們還可以直接將其轉換為圖片格式,看起來就更直觀了:

  如果再取消Dropout層的註釋,即繪圖時加上Dropout層,也還是很不錯的:

  如果我們再加上LeakyReLU層,就成了這個亂七八糟、不太正確的樣子(原圖實在太大了,就只給大家擷取圖片的一部分):

  可以看到,這樣的話就有些問題了。

  最後,我們看一下這個ann_visualizer第三方庫的原始碼,可以看到該庫支援繪圖的不同種類神經網路層;如果大家的神經網路包含這些層,就可以用ann_visualizer這一第三方庫進行繪圖。

  至此,大功告成。