多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

AI for Beginners 卷积神经网络(CNN)实战:从边缘滤波器到 LeNet 的图像识别全解析

AI for Beginners 卷积神经网络(CNN)实战:从边缘滤波器到 LeNet 的图像识别全解析 教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本指南基于 AI-For-Beginners 课程第 07 课lessons/4-ComputerVision/07-ConvNets的完整内容撰写。课程从为什么 MNIST 上的全连接网络无法胜任真实图像识别出发系统讲解卷积滤波器的原理、CNN 的三大核心思想、金字塔式架构并通过 PyTorch/TensorFlow 双份 Notebook 与宠物品种分类实验带你从零实现并训练出自己的卷积网络。读完本文你将掌握卷积层与池化层的核心参数配置、经典 CNN 架构VGG、ResNet、Inception、MobileNet的设计动机以及一套可直接运行在 CIFAR-10 与 Oxford-IIIT Pet 数据集上的实操方案。为什么需要卷积神经网络从 MNIST 到真实世界目标识别在课程前面的单元中我们已经见识过神经网络对图像的处理能力——即便是单层感知机one-layer perceptron也能在 MNIST 手写数字数据集上以不错的准确率完成识别。但 MNIST 是一个非常特殊的基准所有数字都被居中放置在图像内任务因此被极大简化。而在现实世界中我们希望在不依赖物体精确位置的前提下识别图像中的目标。这正是计算机视觉与通用分类任务的根本区别当我们在图片中寻找某个物体时实际上是扫描图像、寻找特定模式及其组合。以找猫为例先寻找水平方向的线条它们可能构成胡须若干胡须的特定组合便能指示这是一只猫。关键在于模式的相对位置与存在性而非它们在图像中的精确坐标。这种平移不变性translation invariance需求正是卷积神经网络Convolutional Neural Network, CNN被设计出来的根本动因。卷积滤波器提取模式的基础工具要提取图像中的模式课程引入的核心概念是卷积滤波器convolutional filters。图像在计算机中表现为二维矩阵灰度图或带颜色深度的三维张量RGB 彩图。对图像施加一个滤波器就是拿一个相对较小的滤波器核filter kernel矩阵对原始图像中的每个像素与其邻域点计算加权平均。可以把它想象成一个在整张图片上滑动的小窗口按核矩阵中的权重对所有像素做加权求和。课程用两个经典的 3×3 边缘检测滤波器演示了这一点图见 垂直边缘滤波器 与 水平边缘滤波器垂直边缘滤波器水平边缘滤波器图像由 Dmitry Soshnikov 提供在 ConvNetsPyTorch.ipynb 中这两个滤波器被定义为如下权重矩阵垂直边缘滤波器$$\left(\begin{matrix} -1 0 1 \ -1 0 1 \ -1 0 1 \end{matrix}\right)$$当窗口扫过像素值相对均匀的区域时所有加权值相加约为 0而一旦遇到图像中的垂直边缘就会产生一个很高的响应值。这就是为何在可视化结果中垂直边缘呈现出高/低数值的强烈对比而水平边缘则被平均化掉。施加水平边缘滤波器时情况正好相反——水平线条被放大垂直线条被平均掉。在传统计算机视觉中人们会手工设计多种滤波器来生成特征再交给机器学习算法构建分类器Leung-Malik Filter Bank一种著名的纹理滤波器组图见课程文件就是这类人工特征工程的代表。CNN 的革命性之处在于我们不再手工设计滤波器而是把网络结构设计成可以自动学习最优滤波器的形式。这正是整个课程反复强调的核心思想。CNN 的三大核心思想课程将 CNN 的工作原理提炼为三条重要结论卷积滤波器可以提取模式——局部卷积天然具备检测边缘、线条等底层特征的能力网络可以自动训练滤波器——通过反向传播让卷积核的权重在训练过程中自适应地调整找到对当前分类任务最有判别力的模式同样的方法可以用于高层特征——不仅是原始图像卷积还能作用在已提取的特征之上从而形成特征的层次结构hierarchy of features从低层的像素组合逐级上升到图片局部的高层组合。图像来源于 Hislop-Lynch 等人的论文该图亦收录于课程images/目录从源码结构看Notebook 中对该思想的落地方式非常直观第一个卷积层寻找诸如水平/垂直笔画之类的初级模式随后的卷积层在其输出上继续叠加寻找形状、部件直至最终目标类别。动手实验单卷积层、池化与多层 CNN课程提供两份可直接运行的 NotebookPyTorch 版ConvNetsPyTorch.ipynb 与 TensorFlow 版ConvNetsTF.ipynb。两者均从 MNIST 出发逐步过渡到真实图像这里以 PyTorch 版为线索展开。卷积层的定义与参数在 PyTorch 中卷积层通过nn.Conv2d构建需要指定以下关键参数in_channels输入通道数。MNIST 是灰度图因此为 1CIFAR-10 等彩色图则为 3out_channels要使用的滤波器卷积核数量。Notebook 中选用 9 个滤波器给网络充分的探索空间去学习对场景最优的卷积核kernel_size滑动窗口的尺寸通常使用 3×3 或 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使用torchinfo.summary打印模型结构可以看到该网络总参数约52,084 个而此前课程中全连接多层网络的参数量约为 80k。更少的参数意味着更好的泛化能力即便在更小的数据集上也能取得不错的成绩——Notebook 中仅训练 5 个 epoch验证集准确率就达到了约 97.6%明显优于同实验条件下前一单元的全连接网络。Notebook 还演示了如何可视化训练后卷积层的权重plot出的 9 个滤波器热力图中部分已经能看出对斜向笔画的响应模式另一些则仍显得比较随机——这恰恰说明网络在训练中自主组织出了有意义的特征。池化层压缩空间维度在检测到某个 3×3 窗口内存在水平笔画后精确到具体是哪一个像素已不再重要因此可以通过**池化层pooling layers**对图像降采样平均池化Average Pooling对滑动窗口例如 2×2 像素内的值取平均最大池化Max Pooling用窗口内的最大值替换整个窗口。其背后的直觉是检测窗口内是否存在某类模式。一个典型的多层 CNN 由若干卷积层构成卷积层之间穿插池化层以减小特征图的尺寸同时不断增加滤波器数量因为模式越高级值得搜索的有趣组合就越多。课程给出了一个具体的多层实现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 x关于该定义Notebook 特别提醒了三点工程细节这里没有单独实例化Flatten层而是在forward中用view函数展平张量——因为展平操作没有可训练权重不必占用独立的层实例池化层同样不含可训练参数因此整个模型只复用self.pool这一个实例即可该模型可训练参数骤降到约8,490 个。卷积层本身参数很少加之送入最终全连接层前特征图的维度已被大幅压缩小参数量对模型有正面影响——在更小的数据集上也能有效防止过拟合。训练结果显示多层 CNN 仅需 1~2 个 epoch 便能超过单层模型的准确率。这说明更精细的网络架构需要更少的数据就能看明白图像的通用模式。金字塔架构Pyramid Architecture绝大多数用于图像处理的 CNN 都遵循所谓的金字塔架构施加在原始图像上的第一个卷积层通常只有相对较少的滤波器8~16 个对应不同像素组合如水平/垂直笔画线进入下一层时减小网络的空间维度、增加滤波器数量以容纳更多简单特征的组合方式每经过一层随着网络越来越接近最终分类器图像的空间尺寸持续下降滤波器数量则持续增长。因为空间维度递减、特征/滤波器维度递增这种架构被形象地称为金字塔架构。课程目录中的 cnn-pyramid.png 直观展示了多个卷积层 穿插池化层的典型结构。课程以VGG-16作为金字塔架构的实例该网络在 2014 年 ImageNet 图像分类竞赛中取得了 top-5 准确率92.7%层结构图见 vgg-16-arch1.jpg金字塔结构图见 vgg-16-arch.jpg。VGG-16 本质上就是一系列卷积-池化层的序列组合清晰地体现了金字塔架构的设计范式。经典 CNN 架构盘点课程在 CNN_Architectures.md 中进一步梳理了四个最具代表性的 CNN 家族理解它们的设计动机有助于你在实际任务中选型。VGG-16金字塔架构的标准范式正如上文所述VGG-16 通过堆叠卷积-池化层把空间分辨率逐级压缩、通道数逐级放大直至送入分类层。它是金字塔架构最直观、最标准的体现。ResNet残差块与恒等通路ResNet 是微软研究院于 2015 年提出的一系列模型ResNet 论文图见 resnet-block.png。其核心思想是使用残差块residual blocks引入恒等通路identity pass-through的理由是让网络层去预测上一层结果与残差块输出之间的差值difference——这正是residual残差一名的由来。这样的块训练起来容易得多可以堆叠数百层常见变体为 ResNet-52、ResNet-101 与 ResNet-152。从训练动态看可以把这种网络理解为能够根据数据集自适应调整自身复杂度训练初期权重值很小大部分信号经由恒等通路直接通过随着训练进行、权值逐渐增大网络参数的显著性上升网络随之调整自身表达能力以正确分类训练图像。Google Inception多路径组合与 1×1 卷积Google Inception 架构把这一思想又推进了一步每个网络层被构建为多条不同路径的组合Inception 模块结构图见 inception.png。这里尤其需要强调1×1 卷积的作用。乍看之下用 1×1 的滤波器扫过图像似乎毫无意义但请记住卷积滤波器同样作用于多个深度通道最初是 RGB 三通道后续层则是不同滤波器的通道1×1 卷积正是用不同的可训练权重把这些输入通道混合起来——它也可以被看作在通道维度上进行降采样pooling。MobileNet深度可分离卷积MobileNet 是一族大幅缩减体积、适合移动端设备的模型。当你资源紧张、可以牺牲少量精度时它们是首选。其核心机制是深度可分离卷积depthwise separable convolution把标准卷积滤波器分解为空间卷积 通道维度上的 1×1 卷积的复合形式从而显著减少参数量使网络体积更小也更容易用更少的数据训练。进阶实战从 MNIST 到 CIFAR-10 与 LeNet在 Notebook 的后半部分课程用CIFAR-10数据集6 万张 32×32 的彩色图像、10 个类别把问题升级到真实场景transform torchvision.transforms.Compose( [torchvision.transforms.ToTensor(), torchvision.transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) trainset torchvision.datasets.CIFAR10(root./data, trainTrue, downloadTrue, transformtransform) trainloader torch.utils.data.DataLoader(trainset, batch_size14, shuffleTrue) testset torchvision.datasets.CIFAR10(root./data, trainFalse, downloadTrue, transformtransform) testloader torch.utils.data.DataLoader(testset, batch_size14, shuffleFalse) classes (plane, car, bird, cat, deer, dog, frog, horse, ship, truck)针对 CIFAR-10 的著名架构是LeNet由 Yann LeCun 提出它遵循前面讲过的所有原则主要区别是输入为 3 个颜色通道而非 1 个。另外模型做了一个简化输出层不再使用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 xtorchinfo.summary显示 LeNet 总参数约 59,386 个。训练时使用带动量的 SGDopt torch.optim.SGD(net.parameters(), lr0.001, momentum0.9) hist train(net, trainloader, testloader, epochs3, optimizeropt, loss_fnnn.CrossEntropyLoss())Notebook 中 3 个 epoch 的训练把验证准确率推到了约 52%。看起来不高但请记住盲目猜测只有 10% 的准确率而且 CIFAR-10 比 MNIST 手写数字分类困难得多——能在如此短的训练时间内超过 50%已经是相当不错的成绩。同时 Notebook 也提示完整训练 LeNet 会耗费可观的时间最好在 GPU 环境中运行。课程挑战宠物面部分类实验Lab为了把 CNN 用到真正复杂的问题上课程的实验环节lab/README.md起始 Notebook 为 PetFaces.ipynb设定了一个贴近现实的场景为宠物托儿所开发应用从一张照片自动识别宠物品种。实验使用Oxford-IIIT Pet Dataset包含 37 个不同品种的猫狗图像。该数据集明显比 MNIST 更复杂图像尺寸更大、类别更多超过 10 类。数据集下载方式!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz !tar xfz images.tar.gz注意Oxford-IIIT Pet 数据集的文件按文件名组织如Abyssinian_1.jpg、Bengal_2.jpgNotebook 中附带了将图像按品种整理到各子目录的代码便于分类训练数据集样例见 lab/images/data.png。课程对实验的提示与延伸思考包括追求更高精度两份 Notebook 底部都有关于如何获得更高精度的备注可以自行做实验验证Top-k 准确率由于部分品种间的差异连人类都难以分辨评测时也建议度量 top-k 准确率CNN 的普适性CNN 不仅适用于视觉任务凡是需要提取固定尺寸模式的任务如从音频信号中找特定模式的一维 CNN、从视频中捕捉特征随时间变化模式的三维 CNN都可以借鉴其思想。总结通过本课的学习你已经掌握了计算机视觉神经网络的核心概念——卷积网络卷积滤波器提取模式、网络自动学习滤波器、以及特征的层次化组合构成了 CNN 一切工作的基础金字塔式架构则给出了空间维度收缩、滤波器数量递增的统一组织范式。现实中支撑图像分类、目标检测乃至图像生成网络的各类架构VGG、ResNet、Inception、MobileNet本质上都是 CNN 的延伸——只是层数更多、叠加了一些额外的训练技巧。配合课程提供的 PyTorch/TensorFlow 两份 Notebook 与宠物面部分类实验你现在已经具备从零训练一个可用于真实图像的卷积分类器的完整能力。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI for Beginners 课程卷积神经网络CNN实战指南——从边缘滤波器到金字塔架构AI for Beginners 课程卷积神经网络CNN实战指南——从边缘滤波器到金字塔架构 本指南是 AI for Beginners 课程第 07 课教程人工智能机器学习深度学习卷积神经网络CNN入门从边缘滤波器到金字塔架构与 LeNet 实战卷积神经网络CNN入门从边缘滤波器到金字塔架构与 LeNet 实战 本篇技术指南以 AI For Beginners 课程第 7 课CNN位于 les教程人工智能机器学习深度学习AI-For-Beginners 卷积神经网络CNN实战指南从卷积核原理到 LeNet 与经典架构AI For Beginners 卷积神经网络CNN实战指南从卷积核原理到 LeNet 与经典架构 导读 卷积神经网络Convolutional Neu教程人工智能机器学习深度学习上一篇Python自动化AutoCADpyautocad终极指南5倍提升CAD工作效率下一篇WaveTools鸣潮工具箱3大核心功能彻底解决PC玩家游戏痛点创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表