AI-For-Beginners 图像分类实战:从卷积滤波器原理到金字塔架构,系统掌握卷积神经网络(CNN) 教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本篇技术指南以 AI-For-Beginners 课程的第 07 课「卷积神经网络ConvNets」为核心围绕「为什么通用神经网络不足以胜任真实图像识别、卷积滤波器如何提取模式、CNN 如何自动学习滤波器、以及 VGG-16 / ResNet / Inception / MobileNet 等经典架构为何都遵循金字塔设计」这条主线展开并结合课程仓库中 PyTorch 与 TensorFlow 两套可运行 Notebook 及其辅助源码给出可直接复制运行的模型定义、训练流程与调参细节。读完后你将能够理解卷积核与边缘检测的本质、搭建从单层卷积到多层池化的 CNN、用 LeNet 在 CIFAR-10 上训练真实图像分类器并具备向 VGG/ResNet 等成熟架构进阶的知识底座。为什么图像分类需要卷积神经网络在 4-ComputerVision/07-ConvNets 这一课中首先回顾了一个重要事实我们此前已经验证过神经网络处理图像的能力相当不错——甚至单层感知机就能以令人满意的精度识别 MNIST 手写数字数据集。但 MNIST 是一个「过于特殊」的数据集所有数字都位于图像的正中央这让分类任务被大幅简化了。在真实生活中我们希望无论物体位于画面中的哪个位置都能把它识别出来。这正是计算机视觉与通用分类的本质区别当我们在一幅图片中寻找某个目标时实际上是在整幅图像上扫描寻找某些特定模式patterns及其组合。课程的典型例子是「找猫」我们先寻找可能构成胡须的水平线条然后某个特定的胡须组合告诉我们这其实是一只猫。这里重要的是模式的相对位置与存在与否而非模式在图像中的精确像素位置。换句话说全连接网络把每个像素当作独立的输入对位置极其敏感而卷积神经网络正是为了解决「位置无关的模式识别」而设计的。卷积滤波器用滑动窗口提取模式为了提取模式我们需要引入卷积滤波器convolutional filters的概念。一幅图像本质上是一个二维矩阵或带颜色深度channel的三维张量。应用一个滤波器意味着取一个相对较小的滤波器核filter kernel矩阵对原始图像中的每个像素用它与其邻域像素计算加权平均。我们可以把它想象成一个小窗口在整幅图像上滑动按照滤波器核矩阵中的权重把所有像素「加权平滑」一遍。课程附带的两个 NotebookConvNetsPyTorch.ipynb 与 ConvNetsTF.ipynb正是从「亲手验证边缘滤波器」开始的。PyTorch 版本通过辅助模块 pytorchcv.py 中的plot_convolution函数把两个经典 3×3 滤波器直接作用在 MNIST 样本上plot_convolution(torch.tensor([[-1.,0.,1.],[-1.,0.,1.],[-1.,0.,1.]]), Vertical edge filter) plot_convolution(torch.tensor([[-1.,-1.,-1.],[0.,0.,0.],[1.,1.,1.]]), Horizontal edge filter)第一个滤波器称为垂直边缘滤波器其权重矩阵为$$\begin{pmatrix} -1 0 1 \ -1 0 1 \ -1 0 1 \end{pmatrix}$$当这个滤波器滑过一片相对均匀的像素区域时所有值相加为 0而当它遇到图像中的垂直边缘时会产生一个高峰值。因此在上面两幅对比图中垂直边缘被表现为高低值而水平边缘则被平滑掉了。水平边缘滤波器$$\begin{pmatrix} -1 -1 -1 \ 0 0 0 \ 1 1 1 \end{pmatrix}$$则恰好相反——水平线条被放大垂直线条被平均掉。|所以这两个滤波器可以被用来「寻找」边缘。同理我们可以设计不同的滤波器去查找其他底层模式。在经典计算机视觉中研究者们手工设计了许多滤波器组例如课程中提到的 Leung-Malik Filter Bank见 images/lmfilters.jpg把滤波结果作为特征交给机器学习算法构建分类器而在深度学习中我们直接构造网络让它自动学习最适合解决当前分类问题的卷积滤波器——这是 CNN 的核心思想之一。值得一提的是TensorFlow 版本的 Notebook 还给出了卷积之所以能训练的原理性解释im2col 变换。它把图像中的每一个 3×3 子区域抽取为矩阵的一列于是「对图像应用卷积」就被等价替换为一次矩阵乘法C(x) W × im2col(x)而矩阵乘法正是可以借助反向传播进行训练的运算。这也从数学上说明了卷积层为何能被端到端训练。CNN 的三大核心思想README.md将 CNN 的工作方式浓缩为三个重要观点卷积滤波器能够提取模式——如上面的边缘检测所示我们可以把网络设计成让滤波器自动被训练——通过引入可训练的卷积层convolutional layers而非手工设计权重同样的思路可以用于在高层特征上寻找模式而不仅限于原始图像。因此 CNN 的特征提取是在一个**特征层级hierarchy of features**上工作的从低层的像素组合点、线、笔画到更高层的图像部件组合直到最终要分类的物体。动手实验让卷积层可训练两种主流框架在同一课程中给出了并行的动手练习。以下分别梳理两条路线。PyTorch 路线首先导入依赖并加载数据Notebook 中以load_mnist(batch_size128)加载 MNIST辅助实现位于 pytorchcv.py其默认批大小为 64import torch import torch.nn as nn from pytorchcv import load_mnist, train, plot_results, plot_convolution, display_dataset load_mnist(batch_size128)卷积层在 PyTorch 中用nn.Conv2d定义需要指定三个关键参数参数含义本例取值in_channels输入通道数灰度图为 1RGB 图为 31out_channels使用的滤波器数量9kernel_size滑动窗口尺寸通常用 3×3 或 5×5(5,5)最简单的 CNN 只包含一个卷积层。对于 28×28 的输入施加 9 个 5×5 滤波器后得到 9×24×24 的张量空间尺寸变小是因为长度为 5 的滑动窗口在 28 个像素上只有 24 个位置可放。随后把 9×24×24 展平为长度 5184 的向量再接一个线性层输出 10 个类别层间使用relu激活class OneConv(nn.Module): def __init__(self): super(OneConv, self).__init__() self.conv nn.Conv2d(in_channels1, out_channels9, kernel_size(5,5)) self.flatten nn.Flatten() self.fc nn.Linear(5184,10) def forward(self, x): x nn.functional.relu(self.conv(x)) x self.flatten(x) x nn.functional.log_softmax(self.fc(x), dim1) return x用summary(net, input_size(1,1,28,28))打印出的结构显示该网络只有52,084 个可训练参数卷积层 234 全连接层 51,850相比之下此前课程中的多层全连接网络约有 80k 参数。参数量的大幅下降意味着 CNN 在小数据集上也能取得好结果因为卷积网络具有更好的泛化能力。Notebook 中记录的训练日志显示仅训练 5 个 epoch验证集准确率就稳定在 97%98%如 Epoch 0 的 Train acc0.947、Val acc0.969到 Epoch 2 的 Val acc0.977。训练完成后还可以把 9 个已训练滤波器的权重可视化其中一些看起来确实像能识别斜向笔画另一些则显得比较「随机」——这正是自动学习的表现。TensorFlow 路线TensorFlow 版本ConvNetsTF.ipynb用 Keras 实现同样的单层卷积模型并通过 tfcv.py 中的plot_convolution可视化边缘滤波器其内部用tf.nn.conv2d完成卷积model keras.models.Sequential([ keras.layers.Conv2D(filters9, kernel_size(5,5), input_shape(28,28,1), activationrelu), keras.layers.Flatten(), keras.layers.Dense(10) ]) model.compile(losskeras.losses.SparseCategoricalCrossentropy(from_logitsTrue), metrics[acc])需要注意一个框架差异Keras 的Conv2D层期望输入形状为W×H×C宽、高、通道channels-last所以灰度图像也要保持C1的第三维训练前需要用np.expand_dims(x_train, 3)增补通道维度。model.summary()显示总参数同样是 52,084。训练 5 个 epoch 后验证准确率达到 0.9833。课程特别提示CNN 在更少的 epoch 内就能取得比全连接网络更高的准确率但每一步训练本身更耗资源在无 GPU 的机器上可能更慢。多层 CNN 与池化层金字塔架构第一层卷积通常只寻找水平/垂直线条这类原始模式我们可以在其上继续叠加卷积层来寻找更高层模式如基本形状再用更多卷积层把形状组合成画面局部最终组合成我们要分类的目标。这个过程伴随一个关键技巧降低图像的空间尺寸。一旦我们在 3×3 窗口内检测到某个水平笔画它具体发生在哪个像素已不那么重要因此可以「缩小」图像。这一步由**池化层pooling layers**完成平均池化Average Pooling取一个滑动窗口例如 2×2 像素计算窗口内数值的平均值最大池化Max Pooling用窗口内的最大值替换窗口其思想是检测滑动窗口内是否存在某个模式。于是典型的 CNN 由若干卷积层构成中间穿插池化层以减小图像尺寸同时不断增加滤波器数量——因为模式越高级需要查找的有趣组合越多。由于空间维度逐层减小、特征滤波器维度逐层增大这种架构被称为金字塔架构pyramid architecture。PyTorch 版本的多层 CNN 定义如下注意Flatten与池化层没有可训练权重因此展平直接在forward中用一个view完成池化层实例也可以复用class MultiLayerCNN(nn.Module): def __init__(self): super(MultiLayerCNN, self).__init__() self.conv1 nn.Conv2d(1, 10, 5) self.pool nn.MaxPool2d(2, 2) self.conv2 nn.Conv2d(10, 20, 5) self.fc nn.Linear(320, 10) def forward(self, x): x self.pool(nn.functional.relu(self.conv1(x))) x self.pool(nn.functional.relu(self.conv2(x))) x x.view(-1, 320) x nn.functional.log_softmax(self.fc(x), dim1) return xsummary显示这个多层网络只有约8.5k 可训练参数——比前两种情况大幅减少。原因在于卷积层本身参数少且送入最终全连接层前图像维度已被显著压缩。参数少对模型有积极影响即使数据集较小也有助于防止过拟合。训练日志显示其准确率比单层卷积更高且收敛更快12 个 epoch 内验证准确率即升至 98% 以上说明更复杂的网络架构需要更少的数据就能抓住图像中的通用模式。作为金字塔架构的典型代表课程引用了VGG-16这是一个在 2014 年 ImageNet top-5 分类上达到92.7% 准确率的网络其层结构正是一串「卷积—池化」交替的序列空间尺寸逐步减半、通道数逐步翻倍进阶实验CIFAR-10 与 LeNet当手写数字识别显得像「玩具问题」时课程把练习推进到更真实的CIFAR-10数据集它包含60k 张 32×32 彩色图像分为 10 个类别plane, car, bird, cat, deer, dog, frog, horse, ship, truck。针对 CIFAR-10 的一个著名架构是 Yann LeCun 提出的LeNet。它遵循同样的金字塔原则主要区别是输入为 3 个颜色通道。PyTorch 版本实现如下并且做了一个简化——输出层不再用log_softmax而是直接返回最后一个全连接层的输出从而可以直接使用CrossEntropyLoss优化class LeNet(nn.Module): def __init__(self): super(LeNet, self).__init__() self.conv1 nn.Conv2d(3, 6, 5) self.pool nn.MaxPool2d(2) self.conv2 nn.Conv2d(6, 16, 5) self.conv3 nn.Conv2d(16, 120, 5) self.flat nn.Flatten() self.fc1 nn.Linear(120, 64) self.fc2 nn.Linear(64, 10) def forward(self, x): x self.pool(nn.functional.relu(self.conv1(x))) x self.pool(nn.functional.relu(self.conv2(x))) x nn.functional.relu(self.conv3(x)) x self.flat(x) x nn.functional.relu(self.fc1(x)) x self.fc2(x) return xPyTorch 版本使用带动量momentum0.9的 SGD、学习率 0.001 训练了 3 个 epochopt torch.optim.SGD(net.parameters(), lr0.001, momentum0.9) hist train(net, trainloader, testloader, epochs3, optimizeropt, loss_fnnn.CrossEntropyLoss())日志显示验证准确率从 0.388 提升到 0.522。乍看似乎不高但请注意盲猜的准确率只有 10%而且 CIFAR-10 的难度远超 MNIST——在如此短的训练时间内超过 50% 已是相当不错的成果。TensorFlow 版本的 LeNetConv2D 6→16后接 120/84/10 三层 Dense使用adam与sparse_categorical_crossentropy训练 10 个 epoch 后验证准确率约 62%。两个 Notebook 都强调对这类模型进行充分训练耗时显著强烈建议在支持 GPU 的环境上运行同时课程也提供了进一步挑战——Notebook 底部给出了提升准确率的提示鼓励读者自行实验。经典 CNN 架构巡礼在 CNN_Architectures.md 中课程总结了现实世界中最重要的几类 CNN 架构它们全都建立在卷积—池化的金字塔原则上VGG-162014 年 ImageNet top-5 分类 92.7% 准确率遵循传统金字塔架构是「卷积—池化」层的典型序列。ResNet微软研究院 2015 年提出的一系列模型核心思想是残差块residual blocks。通过引入恒等通路identity pass-through让每一层去预测「上一层结果与残差块输出之间的差值」——这正是 residual 名称的由来。这类块更容易训练可以堆叠成几百层常见变体为 ResNet-52、ResNet-101、ResNet-152。也可以把这种网络理解为能够根据数据集自动调整自身复杂度训练初期权重值较小大部分信号经恒等通路直通随着训练推进权重变大网络参数的重要性上升模型便调整自身以适应正确分类训练图像所需的表达能力。Google Inception把「每一层」构建为若干不同路径的组合。其中1×1 卷积的作用需要特别强调——表面看用一个 1×1 滤波器扫过图像没有意义但请记住卷积滤波器还作用于多个深度通道最初是 RGB后续层则是不同滤波器的通道1×1 卷积就是用不同的可训练权重把这些输入通道混合起来它也可以被看作在通道维度上进行降采样池化。MobileNet面向移动设备的精简模型族适合资源受限、可以牺牲少量精度的场景。其核心是深度可分离卷积depthwise separable convolution把卷积滤波器分解为「空间卷积」与「深度通道上的 1×1 卷积」的组合大幅减少参数量使网络更小、更容易用更少数据训练。这一单元的核心结论是支撑真实世界中图像分类、目标检测乃至图像生成网络的架构全部基于 CNN只是层数更多、外加一些训练技巧。课后实验宠物品种识别Lab学完上述内容后课程的实战任务见 lab/README.md 与 PetFaces.ipynb是训练一个卷积神经网络使用Oxford-IIIT Pet Dataset包含 37 个猫狗品种的图像自动从照片中判断宠物品种。下载数据的代码片段为!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz !tar xfz images.tar.gz !rm images.tar.gz注意该数据集按文件名组织如Abyssinian_1.jpg、Bengal_2.jpgNotebook 内含按品种创建子目录的整理代码便于分类。这一任务比 MNIST 复杂得多图像尺寸更大、类别超过 10 个。课程同时指出部分品种人眼都难以区分因此还应考虑度量 top-k 准确率。辅助源码 pytorchcv.py 与 tfcv.py 还提供了猫狗数据集加载函数load_cats_dogs_datasetTensorFlow 版本按 224×224、20% 验证集划分可作为继续探索的起点。小结本单元围绕「卷积神经网络为什么是计算机视觉的默认选择」建立了一条完整的学习路径从边缘滤波器这一直观起点理解卷积层如何把「人工设计滤波器」升级为「自动学习滤波器」再通过金字塔架构与池化把底层模式逐级组合为高层语义最终落到 VGG、ResNet、Inception、MobileNet 等真实架构与 CIFAR-10/宠物品种等真实任务上。课程还提示了更广阔的延伸方向CNN 不仅用于视觉也常用于在音频信号中寻找固定尺寸模式1D-CNN以及从视频等多维空间中提取随时间变化的特征3D-CNN。继续深入学习可参考本课的配套 Notebook、CNN_Architectures.md 与 课后实验。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐卷积神经网络CNN全面指南从卷积滤波器到金字塔架构 —— AI for Beginners 第 7 课精讲与实战卷积神经网络CNN全面指南从卷积滤波器到金字塔架构 —— AI for Beginners 第 7 课精讲与实战 本文围绕 AI for Beginner教程人工智能机器学习深度学习AI for Beginners 课程卷积神经网络CNN实战指南——从边缘滤波器到金字塔架构AI for Beginners 课程卷积神经网络CNN实战指南——从边缘滤波器到金字塔架构 本指南是 AI for Beginners 课程第 07 课教程人工智能机器学习深度学习AI-For-Beginners 卷积神经网络CNN实战指南从卷积核原理到 LeNet 与经典架构AI For Beginners 卷积神经网络CNN实战指南从卷积核原理到 LeNet 与经典架构 导读 卷积神经网络Convolutional Neu教程人工智能机器学习深度学习上一篇Navicat无限试用终极指南macOS版14天限制一键破解完整教程下一篇AutoGluon 自动化机器学习框架安装指南覆盖 Linux、Mac、Windows 的三套命令创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考