深度学习------卷积神经网络
目录
一、先吐槽 MLP 的 “笨办法”:为什么它处理图像不行?
二、CNN 的 “聪明思路”:靠两个原则抓住图像本质
1. 平移不变性:不管沃尔多在哪,我都认得他
2. 局部性:先看小范围,再拼大画面
三、CNN 的 “核心部件”:卷积层和池化层是怎么工作的?
1. 卷积层:用 “小窗口” 扫图,提取特征
补充:多通道、填充和步幅
2. 池化层:给图像 “降维”,保留关键特征
四、CNN 的 “进化史”:从 LeNet 到 VGG,越来越能打
1. LeNet(1995):CNN 的 “鼻祖”,处理手写数字
2. AlexNet(2012):CNN 的 “破局者”,赢了 ImageNet
3. VGG(2014):CNN 的 “规整派”,用重复块堆深度
五、CNN 的 “魔法”:自动学特征,不用人工标注
写在最后:打算动手搭个简单的 CNN 试试
为什么 CNN 能轻松分清猫狗?—— 我入门卷积神经网络的关键笔记
今天学卷积神经网络(CNN),终于搞懂了一个困扰我好久的问题:之前用多层感知机(MLP)处理图像时,不仅参数量大到离谱(3600 万像素的图要 36 亿参数),还总把猫的耳朵认成狗的尾巴 —— 原来 MLP 把图像展平成一维向量时,丢了最关键的 “空间信息”。而 CNN 就像给机器装了 “会看图像的眼睛”,既能抓住局部特征,又能大大减少参数。整理了我觉得最核心的知识点,用自己能看懂的话记下来,也帮和我一样刚入门的小伙伴捋捋逻辑。
一、先吐槽 MLP 的 “笨办法”:为什么它处理图像不行?
老师开篇先让我们算一道 “数学题”:用相机拍一张 RGB 猫图,算下来有 3600 万个像素(相当于 3600 万特征),如果用 100 个神经元的单隐藏层 MLP,参数量是 100×3600 万 = 36 亿 —— 这个数字比地球上猫狗的总数还多!
更关键的是,MLP 会把 28×28 的手写数字、3600 万像素的猫图,全拉成一条长长的一维向量。这就像把一幅拼图拆成碎片后打乱,再让你拼回去 —— 机器根本不知道 “左上角的像素和旁边的像素是相邻的”,自然抓不住 “猫的耳朵在脸上方”“狗的尾巴在身后” 这种空间关系。
这时候老师问:“那有没有一种方法,能让机器像人一样‘看’图像 —— 先看局部,再拼整体,还不用那么多参数?”—— 答案就是 CNN。
二、CNN 的 “聪明思路”:靠两个原则抓住图像本质
CNN 能处理图像,核心是靠两个贴近人类视觉习惯的原则,老师用 “找沃尔多” 的游戏举例子,一下子就懂了:
1. 平移不变性:不管沃尔多在哪,我都认得他
玩 “找沃尔多” 时,不管沃尔多在图片左上角还是右下角,我们只要看到 “红条纹衬衫、圆眼镜” 这些特征,就知道是他。CNN 也是这样 —— 前面的卷积层对 “猫耳朵”“狗鼻子” 这些特征的反应,不会因为特征在图像的哪个位置而改变。比如用一个 “检测猫耳朵” 的卷积核,不管猫耳朵在左还是右,这个卷积核都能识别出来,不用像 MLP 那样每个位置都设不同的权重。
2. 局部性:先看小范围,再拼大画面
我们看一张图时,不会一下子把整幅图塞进脑子里,而是先看 “这是一个边缘”“那是一块红色”,再慢慢拼成 “这是猫的脸”。CNN 的前面几层也只关注输入的局部区域,比如用 3×3 的卷积核,每次只看 9 个像素的小范围,不用在意远处像素的关系 —— 这样既符合视觉逻辑,又减少了需要计算的参数。
三、CNN 的 “核心部件”:卷积层和池化层是怎么工作的?
搞懂了原则,再看 CNN 的结构就很清晰了 —— 最关键的是 “卷积层” 和 “池化层”,老师用具体例子拆解得明明白白。
1. 卷积层:用 “小窗口” 扫图,提取特征
卷积层的核心是 “卷积核”(也叫滤波器),可以理解成一个小窗口。比如用 3×3 的卷积核在图像上滑动,每次把窗口里的像素和卷积核的数值相乘再相加,得到一个新的像素值 —— 这个过程就是 “卷积”,能提取出图像的特定特征。
- 边缘检测:用一个中间是 8、周围是 - 1 的 3×3 卷积核,扫过图像后,能把明暗交界的边缘凸显出来(比如猫的轮廓);
- 高斯模糊:用数值中间大、周围小的卷积核,扫过图像后能让画面变模糊,去掉噪声;
- 锐化:用中间是 2、周围是 - 1 的卷积核,能让图像的细节更清晰(比如猫的胡须)。
还有个超重要的点是 “参数共享”:一个卷积核扫完整幅图,只用一套权重,不用像 MLP 那样每个像素都配权重。比如 3×3 的卷积核只有 9 个参数,不管图像多大,这 9 个参数就能提取同一类特征 —— 这就是 CNN 参数量少的关键!
补充:多通道、填充和步幅
- 多通道:彩色图有 RGB 三个通道,卷积时每个通道都要有对应的卷积核,最后把三个通道的结果加起来,得到一个输出通道。如果想提取多种特征(比如同时提边缘和颜色),就用多个卷积核,输出多个通道;
- 填充:卷积后图像会变小(比如 3×3 卷积核扫 5×5 图像,输出是 3×3),边缘的像素只被扫到一次,容易丢失信息。填充就是在图像周围加一圈 0,让输出大小和输入一样,保护边缘信息;
- 步幅:卷积核每次滑动的步数。步幅 1 就是每次挪 1 个像素,步幅 2 就是挪 2 个像素 —— 步幅越大,输出图像越小,计算越快(比如 224×224 的图用步幅 2,很快就能缩小到 112×112)。
2. 池化层:给图像 “降维”,保留关键特征
卷积层输出的特征图还是有点大,池化层的作用就是 “压缩”—— 在小窗口里做简单计算,减少像素数量,同时保留重要特征。老师讲了两种常用的池化:
- 最大池化:比如 2×2 的窗口,取窗口里 4 个像素的最大值。比如猫耳朵区域有 “10、2、3、5”,取 10—— 这样能突出最明显的特征(比如边缘的亮度),还能让模型对微小的位置变化不敏感;
- 平均池化:取窗口里的平均值,比如 “10、2、3、5” 取 5—— 输出更平滑,适合需要保留整体亮度的场景。
比如 LeNet 里用 2×2 平均池化,步幅 2,能把 28×28 的特征图缩小到 14×14,计算量一下子少了一半,还不丢关键特征。
四、CNN 的 “进化史”:从 LeNet 到 VGG,越来越能打
老师说,CNN 的发展是 “站在巨人肩膀上”,从简单到复杂,每一代都解决了上一代的问题。我整理了三个最关键的架构:
1. LeNet(1995):CNN 的 “鼻祖”,处理手写数字
LeNet 是最早的 CNN 之一,专门用来识别手写数字(MNIST 数据集),结构很简单:
- 卷积编码器:2 个卷积层(5×5 卷积核)+2 个平均池化层,先提取边缘、线条这些特征;
- 全连接密集块:3 个全连接层,最后输出 10 个类别(对应 0-9)。
它的缺点是层数少、参数量小,处理不了复杂的彩色图像,但为后来的 CNN 打下了基础 —— 就像 “第一个吃螃蟹的人”,证明了 CNN 处理图像的可行性。
2. AlexNet(2012):CNN 的 “破局者”,赢了 ImageNet
2012 年 AlexNet 在 ImageNet 竞赛里一战成名,把错误率从 26% 降到 15%,彻底改变了计算机视觉的方向。它其实是 “更大更深的 LeNet”,但做了三个关键改进:
- 用 ReLU 代替 sigmoid:sigmoid 在输入太大或太小时会 “梯度消失”,训练不动;ReLU 输入大于 0 就输出本身,小于 0 就输出 0,梯度不容易消失,训练更深的网络也没问题;
- 加了 Dropout:训练时随机 “关掉” 一部分神经元,避免模型死记硬背训练数据(过拟合);
- 用最大池化:比 LeNet 的平均池化更能保留突出特征,比如猫的耳朵、狗的眼睛。
AlexNet 有 8 层(5 个卷积层 + 3 个全连接层),处理 3×224×224 的彩色图,参数量虽然大,但比 MLP 少多了 —— 它证明了 CNN 能处理复杂的自然图像。
3. VGG(2014):CNN 的 “规整派”,用重复块堆深度
VGG 的思路更简单:把 “3×3 卷积 + 2×2 最大池化” 做成一个 “VGG 块”,然后重复这个块,堆出更深的网络(比如 VGG16 有 16 个卷积层,VGG19 有 19 个)。
它的优点是结构规整,容易理解和复现 —— 比如 VGG16 的流程是:输入 224×224×3→2 个 VGG 块(输出 56×56×128)→3 个 VGG 块(输出 28×28×256)→3 个 VGG 块(输出 14×14×512)→3 个全连接层→输出 1000 类(ImageNet 的类别数)。
老师说,VGG 告诉我们 “更深的网络不一定更复杂,重复简单的模块也能提升性能”—— 这也影响了后来的 ResNet、GoogLeNet 等架构。
五、CNN 的 “魔法”:自动学特征,不用人工标注
最让我觉得神奇的是 CNN 的 “特征学习能力”。以前用传统方法处理图像,得人工设计特征(比如用边缘检测算子、颜色直方图),费时又不准;而 CNN 能自己从数据里学特征,而且是分层学的:
- 浅层卷积层:学底层特征,比如边缘、颜色、小斑块(就像我们看图像先看到的线条);
- 中层卷积层:学中层特征,比如条纹、纹路、形状(比如猫的耳朵形状、狗的身体轮廓);
- 高层卷积层:学高层语义特征,比如眼睛、鼻子、尾巴(最后能直接认出 “这是猫”“那是狗”)。
这和人类的视觉系统特别像 —— 我们也是从 “这是一条线” 慢慢到 “这是一个物体”,不用别人教 “什么是边缘”,自己就能悟出来。
写在最后:打算动手搭个简单的 CNN 试试
今天学完最大的感受是:CNN 不是 “黑盒子”,它的每个部件都有明确的作用 —— 卷积层提特征、池化层降维、全连接层做分类,而且思路特别贴近人类的视觉习惯。以前觉得 “识别图像” 是很高深的技术,现在发现只要理解了 “参数共享”“局部性” 这些核心原则,就不难入门。
接下来打算用 PyTorch 搭一个简化版的 LeNet,先试试识别 MNIST 手写数字,再挑战一下用 CNN 做猫狗分类 —— 毕竟光懂理论不行,动手练了才记得牢。如果和我一样刚入门,建议先从 LeNet 入手,搞懂卷积层和池化层的工作原理,再往 AlexNet、VGG 上靠,这样学起来会轻松很多~