Skip to content

我们将在 MacBook 上使用 PlotNeuralNet 绘制精美的 CNN(卷积神经网络)图表,因为它可以生成基于 LaTeX/TikZ 的高质量矢量图,非常适合用于学术论文和技术报告。

这篇教程将带你从零开始,一步步完成环境配置、代码编写和图形生成。


整体流程概览

  1. 环境准备:安装必要的软件,包括 Homebrew、Python、LaTeX (MacTeX)
  2. 下载 PlotNeuralNet:PlotNeuralNet 目前不提供 pip 安装,所以需要手动下载源码并安装。
  3. 编写 Python 脚本:定义你的 CNN 架构
  4. 生成 LaTeX 文件:运行 Python 脚本
  5. 编译生成 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 架构图:


如何绘制更精美的图(高级技巧)

  1. 调整颜色和透明度:在 to_Conv 等函数中,你可以添加 fillopacity 参数来改变颜色和透明度。

    python
    to_Conv(..., fill="\\ConvColor", opacity=0.6)
  2. 绘制残差连接 (Skip Connection):使用 to_skip 函数可以轻松绘制 ResNet 等结构中的跳跃连接。

    python
    # ... 在层A和层C之间 ...
    to_skip(of='层A_name', to='层C_name', pos=1.25)
  3. 使用模块化组件:对于复杂的网络(如 Inception、ResNet Block),PlotNeuralNet 提供了 to_ConvConvRelu 等预定义的块,可以简化代码。

  4. 精细调整布局offset 是你最好的朋友。通过微调 (x, y, z) 的值,你可以精确控制每个层的位置,避免重叠,使布局更美观。x 控制水平距离,y 控制垂直距离,z 控制深度(视觉上的前后)。

  5. 查阅官方示例:PlotNeuralNet 的 GitHub 仓库 包含了大量优秀示例(FCN, U-Net, ResNet 等),是学习高级用法的最佳资源。


常见问题与解决方案 (Troubleshooting)

  • 问题command not found: pdflatex

    • 原因:MacTeX 没有被正确安装,或者其路径没有被添加到系统的 PATH 环境变量中。
    • 解决方案
      1. 确保你已完成 MacTeX 的安装。
      2. 尝试关闭并重新打开终端,有时可以解决 PATH 问题。
      3. 如果仍不行,手动将 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
  • 问题LaTeX Error: File 'tikz.sty' not found.

    • 原因:你的 LaTeX 发行版不完整,缺少 tikz 这个核心绘图包。
    • 解决方案:这通常是因为安装了 BasicTeX 而不是完整的 MacTeX。最简单的解决方法是卸载 BasicTeX 并重新安装完整的 MacTeX。

祝你绘图愉快!