天天看點

Keras可視化神經網絡架構的4種方法

作者:deephub

我們在使用卷積神經網絡或遞歸神經網絡或其他變體時,通常都希望對模型的架構可以進行可視化的檢視,因為這樣我們可以 在定義和訓練多個模型時,比較不同的層以及它們放置的順序對結果的影響。還有可以更好地了解模型結構、激活函數、模型參數形狀(神經元數量)等

Keras可視化神經網絡架構的4種方法

python 中有一些現成的包可以建立我們的神經網絡模型的可視化表示。 前三個包可以在模型訓練之前使用(隻需要定義和編譯模型); 但是Tensor Boards 要求使用者在架構可視化之前根據準确的資料訓練模型。

在開始進行可視化之前,我們先需要安裝相應的包:

pip install visualkeras
pip install ann_visualizer
pip install graphviz           

然後我們建立一個模型,并用這4個包來進行可視化:

在實際使用時我們希望的是通過可視化來對比模型架構,是以這裡定義三個具有不同超參數 CNN 模型。 我們建立了使用者定義的函數來分别建構具有不同數量的 CNN 層、池化層和最後的密集層的三個不同模型。

架構1:淺層CNN+分類頭

def construct_model():
model = Sequential()
model.add(Conv2D(filters=64, kernel_size=(3, 3), input_shape=(128, 128, 1), activation=’relu’))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’relu’))
model.add(MaxPool2D((2, 2)))
model.add(Flatten())
model.add(Dense(256, activation=’relu’))model.add(Dense(12, activation=’softmax’))
model.compile(loss=’categorical_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])
return model           

架構2:深層CNN+mlp分類頭

def sconstruct_model():
smodel = Sequential()
smodel.add(Conv2D(filters=64, kernel_size=(3, 3), input_shape=(128, 128, 3), activation=’relu’))
smodel.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’relu’))
smodel.add(MaxPool2D((2, 2)))
smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
smodel.add(MaxPool2D((2, 2)))
smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
smodel.add(MaxPool2D((2, 2)))
smodel.add(Flatten())
smodel.add(Dense(256, activation=’relu’))
smodel.add(Dense(12, activation=’softmax’))
#optimizer = Adam(lr=0.001)
smodel.compile(loss=’categorical_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])
#model.summary()
return smodel           

架構3:深層CNN+分類頭

def cconstruct_model(learningRate):
smodel = Sequential()
smodel.add(Conv2D(filters=32, kernel_size=(3, 3), input_shape=(128, 128, 1), activation=’relu’))
smodel.add(Conv2D(filters=32, kernel_size=(3, 3), activation=’relu’))
smodel.add(MaxPool2D((2, 2)))
smodel.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’relu’))
smodel.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’relu’))
smodel.add(MaxPool2D((2, 2)))
smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
smodel.add(Conv2D(filters=128, kernel_size=(3, 3), activation=’relu’))
smodel.add(MaxPool2D((2, 2)))
smodel.add(Flatten())
smodel.add(Dense(256, activation=’relu’))
smodel.add(Dense(256, activation=’relu’))
smodel.add(Dense(12, activation=’softmax’))
optimizer = Adam(lr=learningRate)
smodel.compile(loss=’categorical_crossentropy’, optimizer=optimizer, metrics=[‘accuracy’])
smodel.summary()
return smodel           

有了這3個模型,我們将使用4種方法來可視化cnn的結構

ANN Visualizer

ANN Visualizer 的 Python 子產品可以通過幾行代碼來可視化神經網絡。 它使用 Keras 和 Python 的 Graphviz 子產品來生成一個整潔的神經網絡圖。它是最早的幾個可視化包之一,但是最近已經不更新了,我們先介紹他是因為它算是最早出現的,也是最有名的。

ANN Visualizer可視化需要首先編譯模型

model=construct_model()           

主要參數如下:

ann_viz(model, view=True, filename=”network.gv”, title=”MyNeural Network”)

model—Keras的模型

view—在調用ann_viz()之後顯示可視化圖形

filename—檔案名

title—自定義标題

from ann_visualizer.visualize import ann_viz
ann_viz(model, view=True, filename=”cconstruct_model”, title=”CNN — Model 1 — Simple Architecture”)           
Keras可視化神經網絡架構的4種方法

上面就是使用ANN Visualizer建立的construct_model()的可視化圖。可以看到,如果模型太大顯示效果不會太好,這可能也是ANN Visualizer被淘汰的一個原因。

Visual Keras

Visualkeras可以更容易地檢視Keras的神經網絡設計(可以單獨檢視,也可以作為TensorFlow的一部分)。

model1=construct_model()
model2=sconstruct_model()
model3=cconstruct_model(0.009)
import visualkeras
from PIL import ImageFont
visualkeras.layered_view(model1, legend=True)
visualkeras.layered_view(model2, legend=True)
visualkeras.layered_view(model3, legend=True)           
Keras可視化神經網絡架構的4種方法
Keras可視化神經網絡架構的4種方法
Keras可視化神經網絡架構的4種方法

可以通過可視化來對比出不同層的大小,這個還是很有用的

Keras Model Plot

keras.utils.plot_model是keras的内建繪制Keras模型函數,它使用了Graphviz和pydot包。從圖上可,它不如上面使用的包直覺,但它概述了順序模型的基本體系結構。

tf.keras.utils.plot_model(model1,to_file="model.png",show_shapes=True,show_dtype=False,show_layer_names=True,rankdir="TB",expand_nested=True,dpi=96,layer_range=None,show_layer_activations=True,)           

一下是幾個參數的介紹:

  • model: Keras編譯後的模型或模型對象的執行個體
  • to_file:儲存的檔案名
  • Show_shapes:顯示神經網絡中每一層的尺寸和形狀
  • show_layer_activation:顯示神經元内部使用的激活函數
Keras可視化神經網絡架構的4種方法

TensorBoard

TensorBoard 允許使用者可視化不同模型運作的日志。 日志的範圍可以從跟蹤任何模型驗證度量(不同輪次的準确率、召回率、RMSE、MAPE 和 MSE)到建立模型的架構圖。 它是一個強大的工具,可以可視化預期模型是否與預期設計比對,同時深入了解如何使用操作級圖更改模型。

我們需要先加載 TensorBoard,然後建立一個日志目錄。

%load_ext tensorboard
from datetime import datetime
from tensorflow import keras
logdir="logs/fit/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)           

使用Keras TensorBoard回調函數,在訓練前指定日志目錄。然後通過向model.fit()提供這個回調來保證資料被記錄在TensorBoard中。

model.fit(X2_train, Y2_train,batch_size=64,epochs=5,callbacks=[tensorboard_callback])           

X2_train和Y2_train是上面代碼中沒有反映的訓練資料集。你可以用你自己的任何訓練資料來替換它。

Keras可視化神經網絡架構的4種方法

可以看到TensorBoard 始終會顯示操作級别的圖表,雖然對于每一層的架構并不明顯,但是對于每一個操作缺失非常詳細的。

還需要注意的是,與代碼相比該圖是上下颠倒的,因為資料從底部流向頂部。 但是該圖大緻類似于 Keras 模型的描述,有額外的邊通向其他計算節點。

作者:Angel Das

繼續閱讀