天天看點

快速入門使用tikz繪制深度學習網絡圖

【GiantPandaCV導語】本文主要介紹最最最基礎的tikz指令和一些繪制CNN時需要的基礎的LaTeX知識,希望能在盡可能短的時間内學會并實作使用tikz這個LaTeX工具包來繪制卷積神經網絡示意圖。

快速入門使用tikz繪制深度學習網絡圖

之前看到tikz可以畫出這種圖,感覺特别專業,是以萌發出了解一下tikz的想法。

在電腦上安裝過LaTeX都知道,LaTeX安裝包巨大,并且安裝速度緩慢,下載下傳和安裝的時間需要幾乎一下午才能完成。慶幸的是有一個平台可以線上編譯文檔,那就是overleaf,如今overleaf也推出了中文版本網站:https://cn.overleaf.com/ 以下代碼全部是在overleaf平台上編寫運作得到的。

快速入門使用tikz繪制深度學習網絡圖
快速入門使用tikz繪制深度學習網絡圖

最左側是項目檔案清單,中間是代碼編輯區,右側是可視化區,十分友善,隻要網絡通常,就可以友善地得到結果。并且這個平台提供了好多模闆,可以直接使用,太太太太太棒啦。

快速熟悉還是要推薦《minimaltikz》這本電子書,可以直接通路http://cremeronline.com/LaTeX/minimaltikz.pdf擷取或者在背景回複latex擷取。

快速入門使用tikz繪制深度學習網絡圖

這本書一共24頁,算是盡量壓縮了内容了,在這一節中将分析一下其中給的幾個例子,用于快速入門:

所有tikz繪制圖像的代碼都應該在tikzpicture這個環境中使用。

直角坐标系下:(\(<a>\),\(<b>\))的形式代表二維坐标系中的一個點,機關是cm。

極坐标系下:(\(<\theta>\):\(<r>\)),\(\theta\)代表極角,機關是度。

\coordinate可以對某個點進行重命名如:

那最基礎的畫幾條線的實作是通過\draw完成:

--符号代表兩點之間的連線,可以連續連結多段。cycle代表讓路徑回到起點,生成閉合路徑。

快速入門使用tikz繪制深度學習網絡圖

\draw還可以添加選項,比如讓線變粗、變紅、箭頭等需求,都很簡單。

快速入門使用tikz繪制深度學習網絡圖
快速入門使用tikz繪制深度學習網絡圖
快速入門使用tikz繪制深度學習網絡圖

畫一些曲線就需要使用circle、rectangle、arc等進行限制。

快速入門使用tikz繪制深度學習網絡圖

這是練習畫弧線的時候想練習的一個例子,結果如下

快速入門使用tikz繪制深度學習網絡圖

in代表進入的角度,out代表出來時候的角度,為了友善,筆者畫了一個輔助圖,對照代碼友善了解。

快速入門使用tikz繪制深度學習網絡圖

domain限制變量範圍,然後可以畫圖,結果如下:

快速入門使用tikz繪制深度學習網絡圖

通過fill參數控制結果,效果如下:

快速入門使用tikz繪制深度學習網絡圖

使用\node

舉個例子:

快速入門使用tikz繪制深度學習網絡圖

其實CNN畫圖主要用的是畫一條線的功能,下面來看如何畫CNN。

對于一個初學者來說,https://github.com/HarisIqbal88/PlotNeuralNet 這個庫雖然畫的很好,但是難度曲線太高了,退而求其次,使用https://github.com/pprp/SimpleCVReproduction/tree/master/tikz_cnn 進行解析。

首先介紹一個LaTeX中用于封裝的指令,\newcommand,當我們不希望寫很長的指令,那就需要類似函數的一個方式,封裝好固定的操作,根據傳入參數完成執行。

舉一個例子:

輸出結果就是:我喜歡你

假設以下指令調用,結果會是什麼?

顯示結果如下:

快速入門使用tikz繪制深度學習網絡圖

卷積神經網絡的示意圖實際上是一個個立方體構成的,立方體之間可能會有額外連線,代表特征融合;還可能需要題注,為這個特征圖立方體進行命名;必須要有立方體的位置資訊,長寬高;還需要顔色填充的功能;

綜合以上需求,這個函數提供了9個參數分别是:

快速入門使用tikz繪制深度學習網絡圖

由于每繪制一個立方體,右側立方體的X偏置就應該加上左側立方體的Depth值,這部分代碼這樣處理的。

指派過程:

計算立方體表面坐标(将點可視化是額外添加的,為了便于了解)

快速入門使用tikz繪制深度學習網絡圖

計算7個頂點位置,被擋住的也可以計算,但是因為這裡不打算繪制是以不計算。

快速入門使用tikz繪制深度學習網絡圖

繪制立方塊之間的連線:

繪制立方體主體部分,也就是将7個點連接配接起來。

填充顔色:

快速入門使用tikz繪制深度學習網絡圖

上邊的圖是通過以下代碼生成的:

需要注意的是#8和#9指令,mid_front代表的是連結#8=mid的front部分,front也可以被top、back、bottom取代。

快速入門使用tikz繪制深度學習網絡圖

https://cn.overleaf.com/project/5e8c38c31cccb20001a4998d

https://cn.overleaf.com/project/5f50b21ae802b6000155ec4f

https://github.com/HarisIqbal88/PlotNeuralNet

https://github.com/pprp/SimpleCVReproduction/tree/master/tikz_cnn

代碼改變世界