Zing 论坛

正文

从零实现 CNN 和 RNN:一个完整的图像描述生成深度学习项目

本文介绍 Tubes2ML-17-k01 项目,该项目从零实现卷积神经网络(CNN)和循环神经网络(RNN/LSTM),构建了一个完整的图像描述生成(Image Captioning)系统。所有核心组件——包括卷积层、池化层、LSTM 单元和嵌入层——均使用 NumPy 从零构建,随后通过 Keras 等价模型进行验证和对比。

卷积神经网络循环神经网络LSTM图像描述生成深度学习从底层实现NumPyKeras计算机视觉自然语言处理
发布时间 2026/05/16 16:59最近活动 2026/05/16 17:08预计阅读 3 分钟
从零实现 CNN 和 RNN:一个完整的图像描述生成深度学习项目
1

章节 01

导读 / 主楼:从零实现 CNN 和 RNN:一个完整的图像描述生成深度学习项目

本文介绍 Tubes2ML-17-k01 项目,该项目从零实现卷积神经网络(CNN)和循环神经网络(RNN/LSTM),构建了一个完整的图像描述生成(Image Captioning)系统。所有核心组件——包括卷积层、池化层、LSTM 单元和嵌入层——均使用 NumPy 从零构建,随后通过 Keras 等价模型进行验证和对比。

2

章节 02

背景:深度学习从理论到实践的挑战

深度学习课程通常从数学公式和理论推导开始,学生理解了反向传播、梯度下降和激活函数的原理,但往往缺乏将这些理论转化为实际代码的机会。大多数实践项目直接调用 TensorFlow 或 PyTorch 的高级 API,几行代码就能搭建一个神经网络。这种方式虽然高效,却掩盖了底层机制的复杂性。

Tubes2ML-17-k01 项目选择了一条不同的路径:它要求团队从零开始实现 CNN 和 RNN 的核心组件,不依赖任何深度学习框架的内置层。这意味着卷积运算、反向传播、LSTM 的门控机制、梯度检查——所有这些都需要用 NumPy 手动实现。只有在完成从底层实现后,团队才使用 Keras 构建等价模型进行验证和对比。

这种方法的教育价值在于,它迫使学习者真正理解每一个操作的数学本质,而不是将神经网络视为一个黑盒。本文将深入分析这个项目的技术实现、架构设计和实验结果。

3

章节 03

项目概述:端到端的图像描述生成系统

图像描述生成(Image Captioning)是计算机视觉和自然语言处理的交叉任务——给定一张图像,模型需要生成一段自然语言描述。这个任务需要同时理解视觉内容和语言结构,是深度学习领域的一个经典挑战。

Tubes2ML-17-k01 项目构建了一个完整的图像描述生成流水线:

  • CNN 编码器:使用卷积神经网络从图像中提取视觉特征
  • RNN/LSTM 解码器:使用循环神经网络根据视觉特征生成描述文本
  • 从底层实现 + Keras 验证:每个组件都有从底层实现和 Keras 等价版本

项目使用了两个数据集:

  • Intel Image Dataset:用于 CNN 图像分类训练
  • Flickr8k Dataset:用于图像描述生成的训练和评估

评估指标包括 Macro F1 Score(分类)、BLEU-4 和 METEOR(描述生成质量)。

4

章节 04

卷积层(Conv2D)

卷积层是 CNN 的核心组件。在从底层实现中,团队需要手动实现以下操作:

  1. 前向传播:将卷积核在输入图像上滑动,计算局部区域的点积,生成特征图。这涉及到 im2col 或类似的技术来高效地组织数据。

  2. 权重共享机制:卷积层的关键特性是权重共享——同一个卷积核在整个图像上滑动。项目对比了共享权重的 Conv2D 和不共享权重的 LocallyConnected2D,分析了两者在参数量和性能上的差异。

  3. 反向传播:计算损失对卷积核权重和输入的梯度。这需要仔细处理卷积运算的数学性质,包括旋转核 180 度进行梯度卷积。

5

章节 05

ReLU 激活层

ReLU(Rectified Linear Unit)是最常用的激活函数,公式为 f(x) = max(0, x)。虽然前向传播很简单,但反向传播时需要正确处理梯度:对于正输入,梯度为 1;对于负输入,梯度为 0。团队实现了完整的梯度传播机制。

6

章节 06

最大池化层(MaxPooling)

最大池化层通过在每个局部窗口内选择最大值来降低特征图的空间维度。从底层实现需要:

  • 在前向传播时记录每个最大值的位置(mask)
  • 在反向传播时将梯度仅传递到最大值位置,其他位置的梯度为 0
7

章节 07

Flatten 层

Flatten 层将多维特征图展平为一维向量,作为全连接层的输入。虽然实现简单,但需要正确处理批量维度和梯度形状。

8

章节 08

SimpleRNN 单元

循环神经网络(RNN)通过隐藏状态在时间步之间传递信息。SimpleRNN 单元的前向传播公式为:

h_t = tanh(W_hh · h_{t-1} + W_xh · x_t + b)

其中 W_hh 是隐藏状态到隐藏状态的权重矩阵,W_xh 是输入到隐藏状态的权重矩阵。反向传播需要通过时间反向传播(BPTT)算法,将所有时间步的梯度累加。