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 课lessons/4-ComputerVision/07-ConvNets/README.md的核心脉络系统讲解卷积神经网络CNN的工作原理、可训练卷积层的实现方式、金字塔式架构设计以及 VGG-16、ResNet、Inception、MobileNet 等经典网络的设计思想。读完本文你将理解 CNN 为何能学习图像中的模式掌握用 PyTorch 与 TensorFlow 从零构建 CNN 的完整实操路径并能够把学到的架构知识迁移到分类、目标检测乃至图像生成等真实任务中。为什么需要卷积神经网络在 AI-For-Beginners 前面的课程中我们已经验证过神经网络擅长处理图像甚至单层感知机就能以不错的精度识别 MNIST 手写数字。但 MNIST 是一个非常特殊的基准所有数字都居中在图片中央这使得任务被简化了。真实世界中我们希望无论物体在画面中的具体位置在哪里都能把它识别出来。计算机视觉与通用分类的本质区别在于当我们在图片中寻找某个物体时其实是扫描整张图像寻找某些特定的**模式patterns**及其组合。例如当我们寻找一只猫时先会去找可能构成胡须的水平线条然后若干胡须的特定组合会告诉我们——这确实是一张猫的照片。模式的相对位置与存在与否才是关键而不是它们在图像中的精确坐标。为了抽取这些模式我们需要引入**卷积滤波器convolutional filters**的概念。卷积滤波器滑动窗口的加权平均一幅图像可以表示为 2D 矩阵灰度图或带颜色深度的 3D 张量彩色图。对图像应用滤波器就是取一个相对较小的**滤波器核filter kernel**矩阵对原始图像中的每个像素与其邻域点计算加权平均。可以把整个过程想象成一个小的窗口在整幅图像上滑动按照滤波器核矩阵中的权重对所有像素做加权求和。以下两个 3×3 滤波器分别检测垂直边缘与水平边缘图像来自课程原文档原图位于 images/filter-vert.png 与 images/filter-horiz.png垂直边缘滤波器由如下矩阵定义-1 0 1 -1 0 1 -1 0 1当这个滤波器滑过一片相对均匀的像素区域时所有值加起来等于 0一旦遇到图像中的垂直边缘就会产生一个很高的响应值。因此在上图中你可以看到垂直边缘被高亮呈现高值与低值而水平边缘被平均掉。水平边缘滤波器则恰好相反——水平线条被放大垂直线条被平均。在经典计算机视觉中研究者会手工设计大量滤波器来生成特征再交给机器学习算法构建分类器。Leung-Malik Filter Bank 就是这样一个著名的滤波器组包含多个方向、多尺度的滤波器用于提取纹理等低层模式。而在深度学习中我们构造的网络会自动学习最优的卷积滤波器来解决分类问题——这正是 CNN 的核心突破。仓库中的 ConvNetsPyTorch.ipynb 与 ConvNetsTF.ipynb 两本练习手册里都有用plot_convolution函数在 MNIST 手写数字上演示这两个滤波器实际效果的完整代码。CNN 背后的三条核心思想卷积神经网络的工作方式建立在三条重要思想上卷积滤波器可以提取模式如上文所示通过设计不同的核矩阵可以搜索图像中的边缘、线条等低层模式。网络可以被设计成自动训练滤波器卷积层的权重是学习出来的而不是手工指定的。同一套思路可以用于高层特征我们不仅可以在原始图像上找模式还可以在已经提取出的特征图上继续寻找更高层的模式。因此 CNN 的特征提取工作在**特征的层级体系hierarchy of features**上进行——从低层的像素组合如线条、笔画逐层上升到高层的图像部件组合如眼睛、轮子、脸。这张层级化特征提取示意图位于 images/FeatureExtractionCNN.png直观展示了从像素到边缘、从边缘到部件、从部件到物体的逐层抽象过程底层滤波器看到的是小块的局部模式越往上网络看到的视野越大、抽象程度越高。如何让卷积层变得可训练要让卷积层的权重可以通过反向传播学习需要把滤波器窗口在图像上滑动的过程转化为矩阵运算。两本练习手册给出了两种不同的教学路径TensorFlow 路径im2colConvNetsTF.ipynb 详细讲解了im2col矩阵变换把图像的所有 3×3或 5×5局部子区域提取出来排列成一个矩阵im2col(x)再把滤波器权重展平成行向量构成矩阵W那么卷积结果就是一次矩阵乘法C(x) W × im2col(x)——这正是现代深度学习框架包括 TensorFlow、PyTorch 内部高效实现卷积、并支持反向传播的底层原理。PyTorch 路径Conv2d 层ConvNetsPyTorch.ipynb 直接通过nn.Conv2d构建卷积层并强调需要指定的三个关键参数in_channels输入通道数。对灰度图来说输入通道数为 1。out_channels要使用的滤波器数量。练习中用了 9 个不同滤波器让网络有充分机会探索哪些滤波器最适合当前任务。kernel_size滑动窗口大小。通常使用 3×3 或 5×5 的滤波器。以 28×28 的 MNIST 输入为例施加 9 个 5×5 滤波器后输出张量为 9×24×24空间尺寸变小是因为长度为 5 的滑动窗口在 28 个像素内只能有 24 个有效位置。随后把 9×24×24 张量展平成大小为 5184 的向量再接一个输出 10 类的线性层中间使用relu激活函数。最简单的一个单卷积层 CNNPyTorch 版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对应的 TensorFlowKeras版本注意input_shape必须带通道维灰度图通道数为 1model 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])这个网络大约有5 万52,084个可训练参数而前面课程的纯全连接多层网络约有 8 万个参数。参数更少意味着在较小的数据集上也能取得好效果因为卷积网络泛化能力更强。两本练习手册中的训练记录也印证了这一点仅用 5 个 epochPyTorch 版训练精度即达 0.988、验证精度约 0.976TensorFlow 版第 5 轮后训练精度 0.9847、验证精度 0.9833收敛速度和精度都明显优于全连接网络。训练结束后还可以把卷积层学习到的 9 个滤波器权重可视化——你会看到有些滤波器看起来像是能识别斜向笔画有些则看起来相当随机。这也是深度学习黑盒可解释性研究的一个有趣入口。多层 CNN 与池化层金字塔式架构第一层卷积找的是水平线、垂直线这类原始模式但我们可以在此基础上再堆叠卷积层来寻找更高层的模式如基础形状更多卷积层再把这些形状组合成图片的部件最终逼近我们想分类的物体。在这个过程中可以应用一个小技巧降低图像的空间尺寸。一旦我们确定 3×3 窗口内有水平笔画它具体落在哪个像素就不那么重要了。因此我们可以缩小图像尺寸这一步由**池化层pooling layers**完成平均池化Average Pooling取一个滑动窗口例如 2×2 像素计算窗口内数值的平均值。最大池化Max Pooling用窗口内的最大值代替整个窗口。其设计思想是检测窗口内是否存在某个特定模式。因此一个典型的 CNN 会包含多个卷积层层与层之间夹着池化层来降低图像维度同时增加滤波器数量——因为随着模式越来越高级值得探索的组合也越来越多。由于空间维度逐层减小、特征/滤波器维度逐层增大这种架构被称为金字塔式架构pyramid architecture。多层 CNN 示例PyTorch 版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关于这个定义的几个关键细节源自练习手册原注释这里没有单独使用Flatten层而是在forward中用view函数展平张量——因为展平层没有可训练权重不必单独创建层实例。模型里只保留了一个池化层实例并被复用也是因为它不含任何可训练参数。这个模型的可训练参数只有约8,500 个比之前大幅减少卷积层本身参数很少且最终全连接层之前的特征图维度已被显著压缩。参数少对模型有正面影响——即使在较小的数据集上也能有效防止过拟合。训练结果同样印证了架构的价值多层 CNN 仅用 1~2 个 epoch 就能超过单层 CNN 的精度5 轮后训练精度约 0.987、验证精度约 0.981说明更复杂的网络结构需要更少的数据就能理解数据本质、提取通用的图像模式。从 MNIST 走向真实图像CIFAR-10 与 LeNet手写数字识别看起来像个玩具问题但我们现在已经准备好处理更严肃的任务了。练习手册继续使用CIFAR-10数据集它包含 6 万张 32×32 的图像分为 10 个类别plane、car、bird、cat、deer、dog、frog、horse、ship、truck。PyTorch 版通过torchvision.datasets.CIFAR10加载并配合ToTensor与Normalize变换完成数据预处理。针对 CIFAR-10 的经典网络是LeNet由 Yann LeCun 提出它遵循与上面完全相同的设计原则主要区别是输入从 1 个灰度通道变为 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)LeNet 总共约59,386 个可训练参数Conv2d 456 → 2,416 → 48,120两个全连接层 7,744 650再次验证了卷积网络参数省、泛化强的特点。如果希望动手练习可以直接在 ConvNetsPyTorch.ipynb 中把模型切换到 CIFAR-10 上训练。最著名的 CNN 架构在掌握了金字塔式架构的基本原理后CNN_Architectures.md 进一步介绍了四个最有影响力的网络家族这些内容也是本课的延伸重点。VGG-16VGG-16 在 2014 年以 ImageNet Top-5 分类92.7%的准确率夺冠。它遵循传统的金字塔式架构——一系列卷积-池化层的堆叠ResNetResNet 是微软研究院在 2015 年提出的一系列模型。核心思想是使用残差块residual blocks让层去预测上一层输出与残差块输出之间的差值因此得名 residual。引入恒等直连identity pass-through后这些块训练起来容易得多可以构建包含几百个残差块的网络最常见的变体有 ResNet-52、ResNet-101 和 ResNet-152。你也可以把它理解为网络能根据数据集自适应调节复杂度训练初期权重很小、信号大多走恒等直连通道随着训练推进权重变大、网络参数的贡献增长网络逐渐调整到所需的表达能力来正确分类训练图像。Google InceptionGoogle Inception 架构把这一思想再进一步每一层都是若干不同路径的组合。其中特别需要强调1×1 卷积的作用——乍看之下用一个 1×1 滤波器扫过图像似乎没有意义但要记住卷积滤波器也作用于多个深度通道最初是 RGB 颜色后续层是不同滤波器的通道1×1 卷积正是用不同的可训练权重把这些输入通道混合在一起也可以被看作在通道维度上的下采样池化。MobileNetMobileNet 是一族体积更小、适合移动设备的模型。当你资源紧张、可以牺牲一点精度时它们是不错的选择。核心思想是深度可分离卷积depthwise separable convolution把卷积滤波器表示成空间卷积 通道维度上的 1×1 卷积的组合从而大幅减少参数量让网络体积更小也更容易用较少的数据训练。动手实验猫狗品种识别实验室学完理论后课程配套的实验室任务会把你推向真实的复杂问题。lab/README.md 描述了一个应用场景为宠物托儿所开发目录应用其中一项核心功能是从照片自动识别宠物品种。你需要使用Oxford-IIIT Pet Dataset训练一个卷积神经网络对 37 个不同猫狗品种进行分类。数据集图片按文件名组织例如Abyssinian_1.jpg、Bengal_2.jpg练习手册里包含把它们整理到按品种区分的子目录中的代码。实验从 lab/PetFaces.ipynb 开始。这些图片比 MNIST 复杂得多、维度更高而且类别超过 10 个。完成这个实验意味着你从零解决了一个相对复杂的图像分类问题——类别很多但依然能够拿到合理精度。同时因为有些类别之间的差异连人类都难以区分测量top-k 准确率也很有意义即使模型没能把预测第一名压准只要正确类别出现在前 k 名内也能反映出模型的学习质量。总结与延伸学习在本课中你掌握了计算机视觉神经网络的核心概念——卷积网络卷积滤波器通过滑动窗口加权求和提取模式垂直/水平边缘滤波器是最直观的例子可训练卷积层PyTorch 的nn.Conv2d、Keras 的Conv2D把手工设计滤波器变成了自动学习底层依赖im2col这类矩阵变换金字塔式架构通过卷积→池化→卷积的交替堆叠同时降低空间维度、增加滤波器数量在参数更少的情况下取得更高精度MultiLayerCNN 仅约 8.5K 参数经典架构VGG-16、ResNet、Inception、MobileNet是 CNN 思想在真实大规模任务上的成功应用ResNet 的残差块、Inception 的 1×1 卷积、MobileNet 的深度可分离卷积都是值得反复咀嚼的设计精华。现实中支撑图像分类、目标检测乃至图像生成网络的架构本质上都是 CNN——只是层数更多、叠加了一些额外的训练技巧。此外CNN 不只适用于视觉任务它天生擅长提取固定尺寸的模式处理音频时可以用一维滤波器1D-CNN在信号中寻找特定模式有时还会用 3D-CNN 在多维空间提取特征例如视频中随时间变化的特定事件。动手做一做仓库练习手册末尾关于如何获得更高精度的笔记建议尝试能否在 MNIST 或 CIFAR-10 上跑出比基准更高的准确率会是对本课知识最好的巩固。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI-For-Beginners 卷积神经网络CNN实战指南从卷积核原理到 LeNet 与经典架构AI For Beginners 卷积神经网络CNN实战指南从卷积核原理到 LeNet 与经典架构 导读 卷积神经网络Convolutional Neu教程人工智能机器学习深度学习主流 CNN 架构深度解析从 VGG-16 到 MobileNet —— AI-For-Beginners 卷积神经网络架构实战指南主流 CNN 架构深度解析从 VGG 16 到 MobileNet —— AI For Beginners 卷积神经网络架构实战指南 本文以 AI For B教程人工智能机器学习深度学习iCloud照片同步TLPhotoPicker云存储完整解决方案iCloud照片同步TLPhotoPicker云存储完整解决方案 TLPhotoPicker是一款强大的iOS照片选择库支持多张照片选择和PHAssets集创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →