嗨!各位AI探索者们! 上期我们搞懂了神经网络的基本原理,今天要进入一个更激动人心的领域——计算机视觉!️
你有没有想过:手机是怎么认出你的脸的?自动驾驶汽车怎么看懂交通标志的?医生用的AI诊断工具是怎么读X光片的?这些"黑科技"背后都有一个超级英雄——卷积神经网络(CNN)!
今天superior哥就带你揭开CNN的神秘面纱,看看它是如何让计算机拥有"火眼金睛"的!
还记得我们上期学的全连接神经网络吗?它在处理文字、数字还行,但一遇到图片就"傻眼"了!为啥呢?
想象一下,一张普通的手机照片(224×224像素,彩色)有多少个数字?
224 × 224 × 3 = 150,528
个像素值!
如果用传统神经网络,第一层就有1000个神经元的话,需要多少个权重参数?
150,528 × 1,000 = 1.5亿
个参数!!!
这就像用大炮打蚊子,太笨重了!
图片是有"地图"的!眼睛在鼻子上方,嘴巴在鼻子下方,这些位置关系很重要。
但传统神经网络要把2D图片拉成1D的长条(像把地图撕成纸条),位置信息就全乱了!
传统神经网络有严重的"位置敏感症":
这就像一个人,换个位置坐就认不出来了!
好在,CNN天生就是为解决这些问题而生的!
卷积操作是CNN的基础,但它到底是什么?别被这个术语吓到,其实卷积就是一种特殊的"滑动窗口计算"。
想象你拿着一个小小的"魔法放大镜",在一张巨大的拼图上慢慢移动:
在CNN中:
每个卷积核都像一个专门的"特征检测专家":
[ -1 0 1 ]
[ -1 0 1 ] ← 这个卷积核专门找垂直边缘
[ -1 0 1 ]
[ -1 -1 -1 ]
[ 0 0 0 ] ← 这个专门找水平边缘
[ 1 1 1 ]
[ 1 1 1 ]
[ 1 1 1 ] ← 这个专门做模糊处理
[ 1 1 1 ]
让我们用一个超简单的例子看看卷积是怎么算的:
输入图像(5×5):
[ 1 2 3 0 1 ]
[ 0 1 2 3 1 ]
[ 2 1 0 1 2 ]
[ 1 2 1 0 1 ]
[ 0 1 2 1 0 ]
卷积核(3×3):
[ 1 0 -1 ]
[ 1 0 -1 ] ← 垂直边缘检测器
[ 1 0 -1 ]
计算过程:
第一个位置的计算:
1×1 + 2×0 + 3×(-1) +
0×1 + 1×0 + 2×(-1) +
2×1 + 1×0 + 0×(-1) = 1 + 0 - 3 + 0 + 0 - 2 + 2 + 0 + 0 = -2
就这样,一步步扫描完整张图片,得到特征图!
卷积操作产生了特征图,但信息量还是很大。这时候就需要"池化"来压缩信息!
池化就像给图片"缩略图",保留重要信息,丢掉冗余细节:
[ 1 3 ] [ 3 ]
[ 2 4 ] →
[ 1 3 ] [ 2.5 ]
[ 2 4 ] →
一个典型的CNN就像一条"特征提取流水线":
输入图片 → 卷积层 → 激活函数 → 池化层 → 卷积层 → 激活函数 → 池化层 → ... → 全连接层 → 输出分类
卷积层:特征检测专家
⚡ 激活层:决定是否"兴奋"
♂️ 池化层:信息压缩师
全连接层:最终决策者
让我们用Python搭建第一个CNN模型:
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
# 第一层卷积:1个输入通道,32个输出通道,3×3卷积核
self.conv1 = nn.Conv2d(1, 32, 3, padding=1)
# 第二层卷积:32个输入通道,64个输出通道
self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
# 池化层:2×2窗口
self.pool = nn.MaxPool2d(2, 2)
# 全连接层
self.fc1 = nn.Linear(64 * 7 * 7, 128) # 28×28图片经过两次池化变成7×7
self.fc2 = nn.Linear(128, 10) # 10个数字类别
def forward(self, x):
# 第一轮:卷积 → 激活 → 池化
x = self.pool(F.relu(self.conv1(x))) # 28×28 → 14×14
# 第二轮:卷积 → 激活 → 池化
x = self.pool(F.relu(self.conv2(x))) # 14×14 → 7×7
# 展平特征图
x = x.view(-1, 64 * 7 * 7)
# 全连接层
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
# 创建模型
model = SimpleCNN()
print(f"模型参数数量:{sum(p.numel() for p in model.parameters())}")
这个简单的CNN模型只有不到10万个参数,但在手写数字识别上能达到99%以上的准确率!
CNN之所以在计算机视觉领域称霸,主要因为它:
下一期我们要学习RNN循环神经网络,看看AI是如何拥有"记忆力"的!
预告内容:
记得点赞收藏关注三连!我们下期见!
superior哥的CNN小贴士:CNN看似复杂,其实就是模仿人类视觉的"从局部到整体"的认知过程。先看细节(边缘、线条),再组合成形状,最后理解整体。理解了这个思路,CNN就不难了!继续加油!