卷积神经网络结构可视化工具PlotNeuralNet
卷積神經網絡結構可視化
簡介
本文介紹的工具是針對卷積神經網絡示意圖可視化的,不包括算圖。(示意圖一般出現在論文中)常見的卷積神經網絡示意圖繪制工具不少,常用的主要有NN SVG、ConvNetDraw、PlotNeuralNet等。寫這篇重點介紹PlotNeuralNet的教程的原因是國內關于它的教程很少并且大都只是列舉了官方demo。個人覺得PlotNeuralNet是很好看、可定制程度高的卷積神經網絡可視化工具。
常見工具
NN SVG
這是我過去一段時間內比較喜歡用的,特點是很方便,提供給用戶的是個交互式的Web頁面。可以訪問 官方地址使用該工具,網站首頁截圖如下。
該工具的主要特點如下。
- 方便,各層直接界面控制增減及變化。
- 支持三種風格,選擇空間大。
- 支持SVG格式下載。
缺點如下
- 可視化界面的最大問題就是很多用戶期待的功能為考慮全面,定制程度低。
- 各層連接不是很美觀。
ConvNetDraw
我從未使用過,很多博主推薦,但是觀感勸退了我。其官方地址可以訪問使用,首頁截圖如下。
特點如下。
- 腳本化控制
- 尺度自定義
- 直觀
缺點如下。
- 既沒有做到腳本化的自由度,又沒有做到交互界面的觀感。
- 不好看。
PlotNeuralNet
可以訪問其Github官方地址下載該工具。
下面呈現的是前饋網絡的示意圖。
這是我極力推薦的工具,盡管它的上手難度略高于之前兩個,但學會之后很好用,不少論文就是使用這個工具可視化的。
其主要特點如下。
- 腳本化,使用LaTex編寫或者使用Python腳本編寫結構模型,自由度高。
相關缺點如下。
- 無交互界面,上手略有難度。
使用教程
說明
基于Linux或者有bash的環境,我只在Ubuntu系統下測試成功。(事實上,深度學習首選的環境之一就是Ubuntu。)這里只介紹Python腳本繪制的方式,不介紹LaTex方式。需要安裝前置軟件,如LaTex解析器(推薦安裝texlive。)。
前置準備
安裝textlive
調用LaTex解析生成PDF,需要安裝LaTex,這里使用TextLive。可以使用清華的鏡像源下載,Linux環境下執行下面的命令即可。該命令為下載鏡像到當前目錄,失敗則可能換源,去掉上述鏈接的最后文件,在瀏覽器中查看合適文件下載即可。
wget https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/texlive2019.iso
其他相關軟件包安裝
- sudo apt-get install perl-tk
- 安裝圖形界面
- sudo mount -o loop texlive.iso /mnt
- 掛載鏡像
- cd /mnt
- 切換到掛載目錄
- sudo ./install-tl -gui
- 使用圖形界面安裝
- sudo apt-get install texlive-latex-extra
- 安裝擴展包
下載源碼
使用Git將源碼倉庫clone到本地,命令如下。
git clone https://github.com/HarisIqbal88/PlotNeuralNet.git
源碼目錄結構
其中pycore下的tikzeng.py是核心文件,定義了繪圖過程(所有to開頭的函數),可以繪制的層,py腳本向LaTex的轉換。代碼比較易懂,這里不做解析了。
繪制圖形
一般將自己寫的py腳本放在clone的項目的pyexamples目錄下。源目錄下有兩個py腳本,對其進行詳細注釋,包含了常用的語法。
代碼1-test_simple.py
通過cd到pyexamples目錄執行bash ../tikzmake.sh test_simple(注意不加py后綴,且有些錯誤或者警告正常,觀察是否生成pdf文件即可。)具體代碼如下。
import sys sys.path.append('../') # 添加自定義庫的目錄 from pycore.tikzeng import * # 導入自定義庫# defined your arch arch = [# 添加頭to_head( '..' ),to_cor(),to_begin(),# 添加卷積層conv1to_Conv("conv1", 512, 64, offset="(0,0,0)", to="(0,0,0)", height=64, depth=64, width=2 ),# 卷積層conv1東側添加池化層pool1to_Pool("pool1", offset="(0,0,0)", to="(conv1-east)"),# 池化層pool1東側添加卷積層conv2to_Conv("conv2", 128, 64, offset="(1,0,0)", to="(pool1-east)", height=32, depth=32, width=2 ),# 建立pool1到conv2的連接箭頭to_connection( "pool1", "conv2"), # conv2東側添加pool2to_Pool("pool2", offset="(0,0,0)", to="(conv2-east)", height=28, depth=28, width=1),# pool1東側添加softmax層但是偏移3單位to_SoftMax("soft1", 10 ,"(3,0,0)", "(pool1-east)", caption="SOFT" ),# 建立pool2到soft1的連接箭頭to_connection("pool2", "soft1"), # 結束to_end()]def main():namefile = str(sys.argv[0]).split('.')[0]to_generate(arch, namefile + '.tex' )if __name__ == '__main__':main()生成的PDF如下。
代碼2-unet.py
具體代碼如下。
import sys sys.path.append('../') from pycore.tikzeng import * from pycore.blocks import *arch = [ # 開頭to_head('..'), to_cor(),to_begin(),# 添加輸入層to_input( '../examples/fcn8s/cats.jpg' ),# 添加block1包含一個二重卷積接reluto_ConvConvRelu( name='ccr_b1', s_filer=500, n_filer=(64,64), offset="(0,0,0)", to="(0,0,0)", width=(2,2), height=40, depth=40 ),to_Pool(name="pool_b1", offset="(0,0,0)", to="(ccr_b1-east)", width=1, height=32, depth=32, opacity=0.5),# 添加三個block,每個包含三個二卷積加一池化*block_2ConvPool( name='b2', botton='pool_b1', top='pool_b2', s_filer=256, n_filer=128, offset="(1,0,0)", size=(32,32,3.5), opacity=0.5 ),*block_2ConvPool( name='b3', botton='pool_b2', top='pool_b3', s_filer=128, n_filer=256, offset="(1,0,0)", size=(25,25,4.5), opacity=0.5 ),*block_2ConvPool( name='b4', botton='pool_b3', top='pool_b4', s_filer=64, n_filer=512, offset="(1,0,0)", size=(16,16,5.5), opacity=0.5 ),# 瓶頸,為block5to_ConvConvRelu( name='ccr_b5', s_filer=32, n_filer=(1024,1024), offset="(2,0,0)", to="(pool_b4-east)", width=(8,8), height=8, depth=8, caption="Bottleneck" ),to_connection( "pool_b4", "ccr_b5"),# 解碼器# 多個block,每個為unconv*block_Unconv( name="b6", botton="ccr_b5", top='end_b6', s_filer=64, n_filer=512, offset="(2.1,0,0)", size=(16,16,5.0), opacity=0.5 ),to_skip( of='ccr_b4', to='ccr_res_b6', pos=1.25),*block_Unconv( name="b7", botton="end_b6", top='end_b7', s_filer=128, n_filer=256, offset="(2.1,0,0)", size=(25,25,4.5), opacity=0.5 ),to_skip( of='ccr_b3', to='ccr_res_b7', pos=1.25), *block_Unconv( name="b8", botton="end_b7", top='end_b8', s_filer=256, n_filer=128, offset="(2.1,0,0)", size=(32,32,3.5), opacity=0.5 ),to_skip( of='ccr_b2', to='ccr_res_b8', pos=1.25), *block_Unconv( name="b9", botton="end_b8", top='end_b9', s_filer=512, n_filer=64, offset="(2.1,0,0)", size=(40,40,2.5), opacity=0.5 ),to_skip( of='ccr_b1', to='ccr_res_b9', pos=1.25),to_ConvSoftMax( name="soft1", s_filer=512, offset="(0.75,0,0)", to="(end_b9-east)", width=1, height=40, depth=40, caption="SOFT" ),to_connection( "end_b9", "soft1"),# 結束to_end() ]def main():namefile = str(sys.argv[0]).split('.')[0]to_generate(arch, namefile + '.tex' )if __name__ == '__main__':main()其執行結果如下圖。
補充說明
封裝的各類層函數都在tikzeng.py文件中,可以修改并使用。具體的代碼和結果可以在我的Github找到,歡迎star或者fork。實際項目請按照官方項目更新為主。
總結
以上是生活随笔為你收集整理的卷积神经网络结构可视化工具PlotNeuralNet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习进阶-优化的近邻算法
- 下一篇: VGGNet详述