PYTORCH 網絡結構可視化方法彙總(三種實現方法詳解)

轉載自:http://www.freesion.com/article/340667237/

前言:在深度學習的時候,能夠很好的繪製出整個網絡的模型圖,這是非常方便的,當前流行的tensorflow和pytorch都有很多種方法可以繪製模型結構圖,特在此總結如下:

tensorflow的模型結構可視化方法:

(1)使用自帶的tensorboard(不直觀)

(2)使用netron工具打開(.pd 或者是.meta文件)

(3)第三方庫CNNGraph(  https://github.com/huachao1001/CNNGraph

(4)tensorspace.js (這個比較高級,沒用過)

(5)高層API中keras的可視化

pytorch的模型結構可視化方法:

(1)使用tensorboardX(不太直觀)

(2)使用graphviz加上torchviz (依賴於graphviz和GitHub第三方庫torchviz)

(3)使用微軟的tensorwatch (只能在jupyter notebook中使用,個人最喜歡這種方式

(4)使用netron可視化工具(.pt 或者是 .pth 文件)

 

一、使用TENSORBOARDX

使用tensorboardX必須要安裝tensorboard纔行,可能會存在一些版本的匹配問題,下面的版本是親測有效的。

pytorch0.4.1+tensorboard1.7.0+tensorboardX1.4

pytorch1.0.1+tensorboard1.14.0+tensorboardX1.8

上面這兩個都是可行的。

本文以AlexNet爲例,鑑於torchvision已經實現了AlexNet模型,就不再自己編寫,直接導入即可。

import torch
from torchvision.models import AlexNet
 
from tensorboardX import SummaryWriter
 
 
x=torch.rand(8,3,256,512)
model=AlexNet()
 
with SummaryWriter(comment='AlexNet') as w:
    w.add_graph(model, x)  # 這其實和tensorflow裏面的summarywriter是一樣的。

上面的代碼運行結束後,會在當前目錄生成一個叫runs的文件夾,runs文件夾裏面會有一個文件夾Jul22_18-03-19_WH-PC19012AlexNet,裏面存儲了可視化所需要的日誌信息。用cmd進入到runs文件夾所在的目錄中(路勁中不能有中文),然後cmd中輸入:

tensorboard --logdir Jul22_18-03-19_WH-PC19012AlexNet

AlexNet的效果圖如下所示:

當然這裏的節點可以打開進行查看,也可以放大縮小。

二、使用GRAPHVIZ+TORCHVIZ來可視化模型

首先安裝這兩個依賴包:

pip install graphviz  # 安裝graphviz
pip install git+https://github.com/szagoruyko/pytorchviz  # 通過git安裝torchviz

第一步:加載並運行一個模型

import torch
from torchvision.models import AlexNet
from torchviz import make_dot
 
x=torch.rand(8,3,256,512)
model=AlexNet()
y=model(x)

第二步:調用make_dot()函數構造圖對象

# 這三種方式都可以
g = make_dot(y)
# g=make_dot(y, params=dict(model.named_parameters()))
#g = make_dot(y, params=dict(list(model.named_parameters()) + [('x', x)]))

 第三步:保存模型,以PDF格式保存

# 這兩種方法都可以
# g.view() # 會生成一個 Digraph.gv.pdf 的PDF文件
g.render('espnet_model', view=False) # 會自動保存爲一個 espnet.pdf,第二個參數爲True,則會自動打開該PDF文件,爲False則不打開

模型的結構如下:

16374dae4a936f9b15c75f6998c647d9.png

另外,我還可以查詢整個模型的參數量信息,代碼如下:

# 查看模型的參數信息
 
params = list(model.parameters())
k = 0
for i in params:
        l = 1
        print("該層的結構:" + str(list(i.size())))
        for j in i.size():
                l *= j
        print("該層參數和:" + str(l))
        k = k + l
print("總參數數量和:" + str(k))
'''
該層的結構:[64, 3, 11, 11]
該層參數和:23232
該層的結構:[64]
該層參數和:64
該層的結構:[192, 64, 5, 5]
該層參數和:307200
該層的結構:[192]
該層參數和:192
該層的結構:[384, 192, 3, 3]
該層參數和:663552
該層的結構:[384]
該層參數和:384
該層的結構:[256, 384, 3, 3]
該層參數和:884736
該層的結構:[256]
該層參數和:256
該層的結構:[256, 256, 3, 3]
該層參數和:589824
該層的結構:[256]
該層參數和:256
該層的結構:[4096, 9216]
該層參數和:37748736
該層的結構:[4096]
該層參數和:4096
該層的結構:[4096, 4096]
該層參數和:16777216
該層的結構:[4096]
該層參數和:4096
該層的結構:[1000, 4096]
該層參數和:4096000
該層的結構:[1000]
該層參數和:1000
總參數數量和:61100840
'''

三、通過tensorwatch+jupyter notebook來實現

import torch
import tensorwatch as tw
from lanenet_model.blocks import ESPNet_Encoder # 這是我自己定義的一個網絡
 
# 其實就兩句話
model=ESPNet_Encoder()
tw.draw_model(model, [1, 3, 512, 256])

網絡結構如下:

以上就是pytorch種常見的幾種可視化網絡模型的方法,各有利弊,第三種有時候會出現一些莫名的錯誤 ,暫時還未得到解決!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章