Appearance
我们将在 MacBook 上使用 PlotNeuralNet 绘制精美的 CNN(卷积神经网络)图表,因为它可以生成基于 LaTeX/TikZ 的高质量矢量图,非常适合用于学术论文和技术报告。
这篇教程将带你从零开始,一步步完成环境配置、代码编写和图形生成。
整体流程概览
- 环境准备:安装必要的软件,包括 Homebrew、Python、LaTeX (MacTeX)
- 下载 PlotNeuralNet:PlotNeuralNet 目前不提供 pip 安装,所以需要手动下载源码并安装。
- 编写 Python 脚本:定义你的 CNN 架构
- 生成 LaTeX 文件:运行 Python 脚本
- 编译生成 PDF:使用
pdflatex
命令将.tex
文件编译成最终的 PDF 图
下面我们开始分步进行。
步骤一:环境准备 ⚙️
这是最关键的一步,请务必确保所有依赖都已正确安装。
1. 安装 Homebrew(可选)
Homebrew 是 macOS 的包管理器,如果你还没有安装,请打开“终端” (Terminal) 应用,粘贴并运行以下命令:
bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2. 安装 Python(可选)
macOS 自带的 Python 版本较旧,建议使用 Homebrew 安装一个新版本。
bash
brew install python
3. 安装 LaTeX (MacTeX)
PlotNeuralNet 的核心是生成 LaTeX 代码,所以你的电脑必须能编译 LaTeX 文件。在 macOS 上,最简单、最完整的选择是安装 MacTeX。
⚠️ 警告: MacTeX 的完整安装包非常大(约 4GB+),请确保有足够的磁盘空间和稳定的网络连接。
使用 Homebrew Cask 来安装 MacTeX:
bash
brew install --cask mactex
安装过程可能需要一些时间,请耐心等待。安装完成后,pdflatex
等编译命令就会自动添加到系统的 PATH 中。
小提示:如果你是高级用户且不想下载完整的 MacTeX,可以安装 BasicTeX (
brew install --cask basictex
),然后手动通过tlmgr
命令安装tikz
等必要的包。但对于初学者,强烈推荐安装完整的 MacTeX 以避免后续的依赖问题。
步骤二:下载 PlotNeuralNet 源码 📦
bash
git clone https://github.com/HarisIqbal88/PlotNeuralNet.git
至此,所有的准备工作都已完成!
步骤三:编写 Python 脚本定义 CNN 架构 ✍️
现在,我们来创建一个 Python 脚本,用它来定义一个简单的 CNN 模型结构。这个例子包含卷积层、池化层、全连接层和 Softmax 层。
在下载好的 PlotNeuralNet
文件夹中,创建一个名为 my_project/draw_cnn.py
的文件,并将以下代码粘贴进去:
python
# my_project/draw_cnn.py
import sys
sys.path.append('../') # 如果你是从官方 GitHub 克隆的,需要这行
from pycore.tikzeng import *
# 定义你的网络架构
# 这是一个简单的 LeNet-like 结构
arch = [
# 输入层 (虽然不画,但作为起点)
to_head('..'),
to_cor(),
to_begin(),
# ==================== 第一个卷积块 ====================
# to_Conv(name, s_filer, n_filer, offset="(0,0,0)", to="(-1,0,0)", width=1, height=40, depth=40, caption="Input")
to_Conv(name='conv1', s_filer=28, n_filer=6, offset="(0,0,0)", to="(0,0,0)", width=2, height=28, depth=28, caption="Conv1"),
to_Pool(name="pool1", offset="(0,0,0)", to="(conv1-east)", width=1, height=14, depth=14, opacity=0.5),
# ==================== 第二个卷积块 ====================
to_Conv(name='conv2', s_filer=14, n_filer=16, offset="(1.5,0,0)", to="(pool1-east)", width=2, height=14, depth=14, caption="Conv2"),
to_Pool(name="pool2", offset="(0,0,0)", to="(conv2-east)", width=1, height=7, depth=7, opacity=0.5),
# 连接两个卷积块
to_connection("pool1", "conv2"),
# ==================== 全连接层 ====================
# 将池化层“压平”并连接到全连接层
to_SoftMax(name='flatten', offset="(1.5,0,0)", to='(pool2-east)', width=1.5, height=1, depth=25, caption='Flatten'),
to_connection("pool2", "flatten"),
to_SoftMax(name='fc1', s_filer=120, offset="(1.5,0,0)", to="(flatten-east)", width=1.5, height=1, depth=25, caption="FC1" ),
to_connection("flatten", "fc1"),
to_SoftMax(name='fc2', s_filer=84, offset="(1,0,0)", to="(fc1-east)", width=1.5, height=1, depth=20, caption="FC2" ),
to_connection("fc1", "fc2"),
# ==================== 输出层 ====================
to_SoftMax(name='softmax', s_filer=10, offset="(1,0,0)", to="(fc2-east)", width=1.5, height=1, depth=10, caption="Softmax" ),
to_connection("fc2", "softmax"),
# 结束
to_end()
]
def main():
# 生成 LaTeX 文件,命名为 cnn_diagram.tex
to_generate(arch, 'cnn_diagram.tex')
if __name__ == '__main__':
main()
代码解释:
to_Conv(name, s_filer, n_filer, ...)
: 定义一个卷积层。name
: 层的唯一标识符。s_filer
: 特征图的尺寸(例如 28x28)。n_filer
: 滤波器的数量(通道数)。offset
: 相对于前一层的偏移量(x, y, z)
,这是调整布局的关键。to
: 连接的起点,(0,0,0)
表示第一个元素,(conv1-east)
表示连接到conv1
层的东侧(右侧)。width
,height
,depth
: 控制图形块的视觉尺寸。caption
: 层下面的文字说明。
to_Pool(...)
: 定义池化层,参数类似。to_SoftMax(...)
: 可用于定义全连接层或 Softmax 层。to_connection("from_layer", "to_layer")
: 在两个层之间画一条连接线。to_generate(arch, 'filename.tex')
: 将定义好的arch
列表生成一个 LaTeX 文件。
步骤四:运行 Python 脚本生成 .tex
文件 📜
在终端中(确保你处于 PlotNeuralNet/my_project
目录),运行你的 Python 脚本:
bash
python draw_cnn.py
执行成功后,你会在文件夹里看到一个新文件:cnn_diagram.tex
。这个文件包含了所有用于绘图的 LaTeX/TikZ 代码。
步骤五:编译 .tex
文件生成最终的 PDF 图 🖼️
这是最后一步!使用 pdflatex
命令来编译 .tex
文件。
bash
pdflatex cnn_diagram.tex
重要提示:有时需要运行两次命令才能正确生成所有标签和引用。
编译完成后,你会看到一堆辅助文件(如 .aux
, .log
),但最重要的是,你会得到一个 cnn_diagram.pdf
文件!
打开它,你将看到一张专业、精美的 CNN 架构图:
如何绘制更精美的图(高级技巧)
调整颜色和透明度:在
to_Conv
等函数中,你可以添加fill
和opacity
参数来改变颜色和透明度。pythonto_Conv(..., fill="\\ConvColor", opacity=0.6)
绘制残差连接 (Skip Connection):使用
to_skip
函数可以轻松绘制 ResNet 等结构中的跳跃连接。python# ... 在层A和层C之间 ... to_skip(of='层A_name', to='层C_name', pos=1.25)
使用模块化组件:对于复杂的网络(如 Inception、ResNet Block),PlotNeuralNet 提供了
to_ConvConvRelu
等预定义的块,可以简化代码。精细调整布局:
offset
是你最好的朋友。通过微调(x, y, z)
的值,你可以精确控制每个层的位置,避免重叠,使布局更美观。x
控制水平距离,y
控制垂直距离,z
控制深度(视觉上的前后)。查阅官方示例:PlotNeuralNet 的 GitHub 仓库 包含了大量优秀示例(FCN, U-Net, ResNet 等),是学习高级用法的最佳资源。
常见问题与解决方案 (Troubleshooting)
问题:
command not found: pdflatex
- 原因:MacTeX 没有被正确安装,或者其路径没有被添加到系统的
PATH
环境变量中。 - 解决方案:
- 确保你已完成 MacTeX 的安装。
- 尝试关闭并重新打开终端,有时可以解决 PATH 问题。
- 如果仍不行,手动将 TeX Live 的路径添加到你的 shell 配置文件(如
~/.zshrc
)中:bash# 找到你的 TeX Live 版本,通常是 /usr/local/texlive/2023/ # 将下面这行添加到 ~/.zshrc 文件末尾 (年份可能不同) export PATH="/usr/local/texlive/2023/bin/x86_64-darwin:$PATH" # 然后运行 source ~/.zshrc
- 原因:MacTeX 没有被正确安装,或者其路径没有被添加到系统的
问题:
LaTeX Error: File 'tikz.sty' not found.
- 原因:你的 LaTeX 发行版不完整,缺少
tikz
这个核心绘图包。 - 解决方案:这通常是因为安装了 BasicTeX 而不是完整的 MacTeX。最简单的解决方法是卸载 BasicTeX 并重新安装完整的 MacTeX。
- 原因:你的 LaTeX 发行版不完整,缺少
祝你绘图愉快!