前言刚入门深度学习的同学很容易搞混两件事什么时候用 CNN什么时候用 RNN。图片、照片、摄像头画面、医学影像空间结构数据 →CNN 卷积神经网络句子、语音、股价、气温时序、文字对话前后有序依赖的数据 →RNN 循环神经网络。本文整合 CNN 完整图像知识 卷积 / 池化原理、RNN 词嵌入 循环时序原理全程大白话避开晦涩公式堆砌配套全新独立案例代码不照搬原文示例从零带你吃透两大基础网络看完就能手写简单图像分类、文本处理模型。第一部分CNN 卷积神经网络 —— 专门处理图像一、图像底层基础知识看懂 CNN 的前提1. 计算机怎么看懂图片像素与通道所有图片在电脑里都是数字矩阵最小单位是像素像素取值范围0~255数值 0纯黑色数值 255纯白色中间数值是深浅过渡。图像分 4 种常见类型二值图仅 1 个通道像素只有 0、1 两种取值一般用于文字扫描、黑白线条图。灰度图单通道图像像素取值范围 0~255常应用在人脸识别、医学 X 光片等场景。索引图同样为 1 通道像素区间 0~255多用于压缩动图、色彩数量较少的图片。RGB 彩色图包含红、绿、蓝 3 个通道像素取值 0~255手机拍摄的日常照片都属于这类图像。图像存储格式约定普通读取[H, W, C]→ 高、宽、通道PyTorch 模型输入必须转成[Batch, C, H, W]批次、通道、高、宽。2. 代码实操用 matplotlib 生成 / 读取图片import numpy as np import matplotlib.pyplot as plt # 1. 生成纯黑、纯白测试图 def create_color_img(): # 200*200 三通道黑色图 black np.zeros((200, 200, 3), dtypenp.uint8) plt.imshow(black) plt.axis(off) plt.title(纯黑图像) plt.show() # 纯白图 white np.full((200, 200, 3), 255, dtypenp.uint8) plt.imshow(white) plt.axis(off) plt.title(纯白图像) plt.show() # 2. 读取本地真实图片查看尺寸 def read_local_img(): img plt.imread(test.jpg) print(f图片形状[H,W,C]{img.shape}) plt.imshow(img) plt.axis(off) plt.title(原图展示) plt.show() if __name__ __main__: create_color_img() read_local_img()二、CNN 整体概述为什么不用全连接非要卷积1. 全连接网络处理图片的致命缺陷一张 640×640 彩色图像素总量640*640*31228800全连接第一层就会产生百万级参数存在两大问题参数爆炸训练慢、极易过拟合丢失空间信息全连接把图片拍平成一维分不清上下左右无法识别边缘、轮廓。2. CNN 核心优势局部连接 权重共享局部感受野卷积核只和图片一小块区域计算不用全局连接权重共享同一个卷积核在整张图滑动一套权重复用参数量大幅降低平移不变性物体在图片左上角 / 右下角卷积都能识别同类特征。3. CNN 标准三层流水线所有图像任务通用卷积层 Conv2d提取图像特征底层边缘、纹理多层堆叠后五官、物体轮廓池化层 Pool下采样降维压缩图片尺寸保留核心特征减少计算全连接层 Linear把二维特征图展平输出分类 / 检测结果。配套激活层 ReLU卷积计算后加入非线性让网络能学习复杂图像特征。4. CNN 主流应用场景图像分类、人脸识别、自动驾驶目标检测、医学病灶识别、图像语义分割、手写数字识别。 经典 CNN 架构LeNet-5手写数字开山之作、AlexNet、VGG、GoogLeNet、ResNet解决深层网络梯度消失。三、卷积层 Conv2d图像特征提取核心1. 卷积运算底层逻辑核心操作卷积核滤波器和图片局部区域做内积。卷积核固定尺寸权重矩阵常见 3×3、5×5一个卷积核提取一类特征特征图 Feature Map原图经过卷积核滑动计算后输出的新矩阵代表提取到的纹理 / 边缘。2. 三大关键超参Padding、Stride、Kernel_size1Padding 填充在图片四周补 0 像素解决两个痛点不填充时卷积后图片持续缩小深层网络容易丢失边缘像素Same Padding填充后输出特征图尺寸 输入图片尺寸方便多层网络搭建。2Stride 步长卷积核每次滑动移动的像素数stride1逐像素滑动细节保留完整stride2隔一个像素滑动直接缩小特征图替代部分池化降维。3输出特征图尺寸计算公式W输入图片宽高F卷积核大小P填充S步长向下取整。举例5×5 图片3×3 卷积核padding1stride1N(5−32×1)/115输出仍为 5×5。3. 多通道、多卷积核计算规则RGB 三通道图像卷积卷积核通道数必须和图片通道一致3 通道每个通道单独卷积后数值相加得到单张特征图多卷积核设置 out_channelsN代表 N 个不同卷积核同时提取 N 类特征输出 N 张特征图通道数等于卷积核数量。4. PyTorch 卷积 API 实战import torch import torch.nn as nn import matplotlib.pyplot as plt # 解决中文乱码 plt.rcParams[font.sans-serif] [SimHei] # 或 Microsoft YaHei plt.rcParams[axes.unicode_minus] False def conv_image_test(): # 读取图片 img plt.imread(test.jpg) # 形状 (H, W, C)通常是 uint8 h, w, c img.shape print(f原图尺寸 H:{h}, W:{w}, C:{c}) # 1. 构建卷积层 conv nn.Conv2d(in_channels3, out_channels4, kernel_size3, stride2, padding0) # 2. 转换维度HWC → CHW → [B, C, H, W] img_tensor torch.tensor(img).permute(2, 0, 1).unsqueeze(0).float() print(f模型输入张量形状{img_tensor.shape}) # 3. 前向传播得到特征图 feature conv(img_tensor) print(f卷积输出特征图形状{feature.shape}) # 4. 取第一张特征图通道0 feat_map feature[0, 0].detach().numpy() # 形状 (H_out, W_out) # ---------- 可视化原图 特征图 并排 ---------- fig, axes plt.subplots(1, 2, figsize(10, 5)) # 左原图 axes[0].imshow(img) # 彩色显示 axes[0].set_title(原图) axes[0].axis(off) # 右特征图灰度 axes[1].imshow(feat_map, cmapgray) axes[1].set_title(卷积提取特征图 (通道0)) axes[1].axis(off) plt.tight_layout() # 自动调整子图间距 plt.show() if __name__ __main__: conv_image_test()效果图四、池化层 Pool降维压缩减少计算量1. 池化两大核心作用空间降维缩小特征图宽高大幅减少后续计算参数特征鲁棒性轻微平移、噪声不会影响特征识别降低过拟合。2. 两种主流池化MaxPool2d 最大池化窗口内取最大值保留最明显纹理 / 边缘工业最常用AvgPool2d 平均池化窗口内取平均值柔和保留全局信息多用于全局特征聚合。3. 多通道池化特点池化不会改变通道数量每个通道独立池化通道数前后保持一致。4. PyTorch 池化代码示例import torch import torch.nn as nn # 单通道池化测试 def pool_single(): # 3×3单通道矩阵 data torch.tensor([[[0,1,2],[3,4,5],[6,7,8]]], dtypetorch.float) # 最大池化 2×2窗口步长1 max_pool nn.MaxPool2d(kernel_size2, stride1) print(最大池化结果\n, max_pool(data)) # 平均池化 avg_pool nn.AvgPool2d(kernel_size2, stride1) print(平均池化结果\n, avg_pool(data)) # 多通道池化测试 def pool_multi(): # 3通道3×3数据 data torch.tensor([ [[0,1,2],[3,4,5],[6,7,8]], [[10,20,30],[40,50,60],[70,80,90]], [[11,22,33],[44,55,66],[77,88,99]] ], dtypetorch.float) pool nn.MaxPool2d(2, 1) print(多通道池化结果\n, pool(data)) if __name__ __main__: pool_single() pool_multi()第二部分RNN 循环神经网络 —— 处理文本 / 时序数据一、RNN 基础认知专门处理有序序列数据1. 什么是序列数据数据存在严格先后顺序后文依赖前文文本我 喜欢 吃 火锅词语颠倒语义完全改变时序气温、股价、传感器数据语音连续音频波形。CNN 只能处理空间静态图片无法记忆前文信息因此诞生 RNN核心是隐藏状态记忆单元每一步运算携带上一步历史信息。2. RNN 四大应用场景NLP 自然语言情感分析、机器翻译、文本生成、聊天机器人时间序列预测销量、气象、股市预测语音识别、AI 歌曲生成动作时序识别。3. RNN 完整文本处理流水线词嵌入层 Embedding → RNN 循环层 → 全连接输出层词嵌入文字转为低维数字向量RNN 层逐词读取向量用隐藏状态保存上下文记忆全连接层输出分类 / 生成词语概率。二、词嵌入层 Embedding文字数字化必经步骤1. One-hot 编码的缺点假设词表 5000 个词每个词是 5000 维稀疏向量维度爆炸计算开销巨大无法区分语义相近词语奶茶、咖啡向量完全无关。2. 词嵌入三大优势低维稠密向量几千词汇统一映射为 32/64/128 维短向量语义编码语义相近词语向量空间距离更近统一输入格式将离散文字转为神经网络可计算的数值。3. 完整工作流程句子分词 → 构建词表词→唯一索引→ 句子转为索引序列 → Embedding 查表输出词向量 → 送入 RNN。4. PyTorch nn.Embedding 案例代码奶茶短句案例import torch import torch.nn as nn # 奶茶评论语料 words [我, 爱, 喝, 珍珠奶茶, 冰奶茶, 少糖] word2idx {w:i for i,w in enumerate(words)} vocab_size len(word2idx) embed_dim 8 # 每个词映射8维向量 # 构建嵌入层 embedding nn.Embedding(num_embeddingsvocab_size, embedding_dimembed_dim) # 句子转索引 sent_idx torch.tensor([word2idx[我], word2idx[爱], word2idx[珍珠奶茶]]) vec embedding(sent_idx) print(索引序列shape, sent_idx.shape) print(词向量shape [词数量,向量维度], vec.shape) print(“珍珠奶茶”向量, embedding(torch.tensor(3)))三、RNN 循环层自带记忆的时序处理器1. 核心隐藏状态 hRNN 的短期记忆每个时间步输入两部分当前词语词向量上一步记忆​。运算后生成新记忆 ht​传递给下一个词语全程共享同一个神经元循环运算。 隐藏状态三大作用存储历史信息、理解上下文、串联所有时序步骤。2. RNN 核心计算公式更新隐藏记忆输出预测向量输出向量经过 Softmax 转为词语概率用于文本生成 / 分类。3. PyTorch nn.RNN API 介绍nn.RNN(input_size, hidden_size, num_layers1)input_size输入向量维度 词嵌入维度hidden_size隐藏记忆向量长度num_layers堆叠 RNN 层数。output, hn rnn(x, h0)输入[seq_len, batch, input_size]句子长度、批次、词向量维度初始隐藏[num_layers, batch, hidden_size]不传默认全 0所有时间步隐藏状态[seq_len, batch, hidden_size]文本生成使用最后一步全局记忆[num_layers, batch, hidden_size]文本分类使用。4. RNN 单层测试代码import torch import torch.nn as nn seq_len 6 # 单句6个词 batch_size 4 # 4条句子一批 embed_dim 8 # 词向量维度 hidden_dim 16# 记忆向量长度 rnn nn.RNN(input_sizeembed_dim, hidden_sizehidden_dim, num_layers1) # 模拟一批词向量数据 inputs torch.randn(seq_len, batch_size, embed_dim) # 初始化隐藏状态 h0 torch.zeros(1, batch_size, hidden_dim) output, hn rnn(inputs, h0) print(全部时间步输出shape, output.shape) # [6,4,16] print(最终全局记忆hn shape, hn.shape) # [1,4,16]参数匹配规则四、案例RNN 文本情感分类模型奶茶好评 / 差评import torch import torch.nn as nn # 超参数 VOCAB_NUM 12 EMBED_DIM 16 HIDDEN_DIM 32 LAYERS 1 CLASS_NUM 2 # 二分类好评0差评1 class MilkTeaSentimentRNN(nn.Module): def __init__(self): super().__init__() self.embedding nn.Embedding(VOCAB_NUM, EMBED_DIM) self.rnn nn.RNN(EMBED_DIM, HIDDEN_DIM, LAYERS) self.fc nn.Linear(HIDDEN_DIM, CLASS_NUM) def forward(self, x): emb self.embedding(x) _, hn self.rnn(emb) hn hn.squeeze(0) # 去除层数维度 out self.fc(hn) return out if __name__ __main__: model MilkTeaSentimentRNN() # 模拟3条评论每条5个词 test_input torch.randint(0, VOCAB_NUM, (5, 3)) pred model(test_input) print(模型输出 [批次,分类数], pred.shape)第三部分CNN 与 RNN 核心对比 相关问题一、CNN vs RNN 适用场景清晰区分表格网络处理数据核心能力核心结构典型任务CNN 卷积网络图像、空间二维数据提取局部空间特征、平移不变卷积层 池化层图像分类、人脸识别、目标检测RNN 循环网络文本、时序一维有序数据记忆历史上下文、建模先后依赖词嵌入 循环隐藏层情感分析、股价预测、文本生成二、相关问题CNN 相关卷积核为什么多用 3×3 多个 3×3 堆叠可以替代大卷积核参数量更少、非线性更强VGG 网络标准设计。池化会不会丢失信息 只会丢弃无关细节保留最强特征现代网络也常用 stride2 卷积替代池化。图片输入为什么要转 [B,C,H,W] PyTorch 卷积层通道维度放在第二维符合 GPU 并行计算优化规范。RNN 相关output 和 hn 什么时候用 逐词生成任务写诗、翻译用 output整条句子分类只用最后一步 hn。基础 RNN 有什么缺陷 长文本会出现梯度消失远距离前文记忆丢失工业改用 LSTM/GRU。词嵌入维度怎么选 短评论短句 32/64 维长文章、大语料 128/256 维维度越大语义承载越多训练更慢。全文总结CNN 卷积神经网络针对图像空间数据依靠卷积核提取边缘 / 纹理特征池化层降维压缩核心三组件卷积 Conv2d、池化 Pool、全连接 Linear掌握尺寸计算公式与 PyTorch 卷积 / 池化 API 即可搭建简易图像分类模型。RNN 循环神经网络针对有序序列文字、时序依靠隐藏状态存储上下文记忆文本处理固定流程分词→词嵌入 nn.Embedding→nn.RNN 循环层→全连接输出适合 NLP、时间序列预测任务。两大网络是深度学习入门基石CNN 负责视觉、RNN 负责文本与时序理解基础原理后后续学习 ResNet、LSTM、Transformer 等进阶模型会事半功倍。文中所有代码均为全新独立案例不照搬原文示例新手可直接复制运行调试直观观察网络输出变化。