实战指南:从卷积核原理到 LeNet 与经典架构)
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载导读卷积神经网络Convolutional Neural Networks, CNN是计算机视觉的基石——从图像分类、目标检测到图像生成真实世界中的视觉系统几乎都以 CNN 为基础。本指南以 AI-For-Beginners 课程第 7 课《Convolutional Neural Networks》位于 lessons/4-ComputerVision/07-ConvNets/README.md为核心骨架结合仓库内 ConvNetsPyTorch.ipynb、ConvNetsTF.ipynb、pytorchcv.py、tfcv.py 等配套源码完整讲解卷积滤波器、可训练卷积层、金字塔架构并手把手用 PyTorch 与 TensorFlow/Keras 搭建从单卷积层、多层 CNN 到 LeNet 的 MNIST / CIFAR-10 分类器最后纵览 VGG-16、ResNet、Inception、MobileNet 等知名 CNN 架构。读完本指南你将掌握 CNN 的核心原理、两种主流框架的完整实现流程以及如何在 lab/README.md 中完成宠物品种分类实战。为什么图像分类需要卷积神经网络在上一单元多层全连接神经网络中我们已经看到即使单层感知机也能以不错的准确率识别 MNIST 手写数字。但 MNIST 是一个非常特殊的玩具数据集——所有数字都居中放在图像内任务因此被简化。真实场景中我们希望在图片的任意位置都能识别出物体。计算机视觉与通用分类的本质区别在于当我们在图片中寻找某个物体时我们是在扫描图像寻找特定的**模式patterns**及其组合。以寻找猫为例首先寻找水平线条——它们可能构成胡须某种特定的胡须组合告诉我们这是一张猫的图片。关键在于模式的相对位置和存在与否而不是它们在图像上的精确坐标。这种平移不变性无论猫在画面左上角还是右下角我们都能认出它正是 CNN 的核心优势。卷积滤波器如何提取模式滤波器核Filter Kernel的工作方式要提取模式我们使用卷积滤波器convolutional filters的概念。图像本质上是二维矩阵或带有颜色深度的三维张量。应用滤波器意味着取一个较小的滤波器核矩阵filter kernel对原始图像中的每个像素计算其与相邻点的加权平均。可以把滤波器看作一个在整幅图像上滑动的小窗口按照滤波器核矩阵中的权重对窗口内所有像素做加权平均。下图展示了对 MNIST 数字分别应用 3×3 垂直边缘滤波器与水平边缘滤波器的效果——垂直或水平边缘所在的位置被点亮出现高值其他方向则被平均掉|图片作者Dmitry Soshnikov边缘滤波器的数学定义在 ConvNetsPyTorch.ipynb 中垂直边缘滤波器由如下矩阵定义$$ \left( \begin{matrix} -1 0 1 \ -1 0 1 \ -1 0 1 \ \end{matrix} \right) $$当这个滤波器滑过相对均匀的像素区域时所有值相加为 0但当它遇到图像中的垂直边缘时会产生一个高尖峰。因此上图中垂直边缘呈现高值与低值而水平边缘被平均掉。水平边缘滤波器[[-1,-1,-1],[0,0,0],[1,1,1]]则恰好相反——水平线被放大垂直线被平均掉。在经典计算机视觉中人们手工设计多个滤波器对图像提取特征再由机器学习算法构建分类器。而在深度学习中我们构造的网络会自动学习最适合解决分类问题的卷积滤波器——这正是 CNN 的主要思想之一。仓库中的plot_convolution工具函数见 pytorchcv.py就封装了给 MNIST 样本应用指定滤波器并可视化结果的流程方便你直观验证上述原理。除了边缘检测还可以设计各种滤波器寻找其他低层模式例如 Leung-Malik 滤波器组CNN 的核心思想CNN 的工作方式建立在以下重要观点之上卷积滤波器可以提取模式网络可以被设计为自动训练滤波器而非手工设计同样的方法可以应用于高层特征而不仅限于原始图像。因此 CNN 的特征提取是在特征层级hierarchy上进行的——从低层的像素组合一直到高层图片部位的组合图片源自 Hislop-Lynch 等人的论文基于其研究第一个卷积层PyTorch 与 TensorFlow 双实现PyTorchnn.Conv2d构建单卷积层nn.Conv2d需要指定以下参数in_channels输入通道数。灰度图输入为 1彩色图如 CIFAR-10为 3out_channels使用的滤波器数量。示例中使用 9 个不同滤波器让网络充分探索哪种滤波器最适合当前场景kernel_size滑动窗口尺寸通常使用 3×3 或 5×5。最简单的 CNN 只包含一个卷积层。对于 28×28 输入应用 9 个 5×5 滤波器后得到的张量为 9×24×24空间尺寸变小是因为长度为 5 的滑动窗口在 28 个像素内只有 24 个位置。卷积后我们把 9×24×24 张量展平flatten为 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打印结构可见整个网络约5.2 万个可训练参数Conv2d 层 234 个参数Linear 层 51850 个参数对比全连接多层网络约 8 万参数。参数更少意味着卷积网络泛化更好即使在小数据集上也能取得不错的结果。在笔记本中训练 5 个 epoch第一个 epoch 后训练准确率即达 94.7%、验证准确率 96.9%最终验证准确率约 97.7%——比上一单元的全连接网络更快达到更高准确率。还可以可视化训练后卷积层的权重观察其是否学到有意义模式。在 PyTorch 中取net.conv.parameters()第一组参数逐一显示即可有些滤波器看起来能识别斜向笔画另一些则显得随机。TensorFlow/KerasConv2D等价的序列模型对应实现见 ConvNetsTF.ipynb用 Keras 序列 API 定义完全等价的网络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])参数总量同为 52,084训练 5 个 epoch 后验证准确率约 98.3%。注意绝大多数实际应用中卷积层处理的是彩色图像。因此Conv2D层要求输入形状为W×H×C宽×高×颜色通道数灰度图也需要显式指定C1。使用 MNIST 数据前需通过np.expand_dims(x_train,3)在末尾增加通道维度。多层 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关于这个定义有几点值得注意展平操作在forward中用view函数完成无需单独的Flatten层实例展平层没有可训练权重池化层也没有可训练参数因此只实例化一次并复用即可可训练参数骤降至约 8.5K。原因是卷积层本身参数很少且在全连接层之前的特征维度被大幅压缩。参数少对模型有积极影响——即使在较小数据集上也有助于防止过拟合。Keras 等价实现为Conv2D(10,5) → MaxPooling2D() → Conv2D(20,5) → MaxPooling2D() → Flatten() → Dense(10)参数同样为 8,490。实验结果单层 CNN 用 5 个 epoch 达到约 97.7% 验证准确率而两层金字塔 CNN 在第 12 个 epoch 就达到约 98.3% 以上。更精巧的网络架构需要更少数据就能抓住本质、提取通用模式。当然训练本身也更耗资源在非 GPU 机器上会更慢。进阶实战LeNet 与 CIFAR-10 彩色图像分类手写数字识别像是一个玩具问题现在我们转向更严肃的数据集CIFAR-10。它包含 6 万张 32×32 图像分为 10 类plane、car、bird、cat、deer、dog、frog、horse、ship、truck。PyTorch 加载方式首次运行会自动下载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)CIFAR-10 上著名的架构是 Yann LeCun 提出的LeNet。它与前面遵循相同原则主要区别是3 个彩色输入通道。此外做了一点简化不使用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 xLeNet 参数约 5.9 万PyTorch 版本结构为Conv2d(3,6,5) → MaxPool2d(2) → Conv2d(6,16,5) → MaxPool2d(2) → Conv2d(16,120,5) → Flatten → Linear(120,64) → Linear(64,10)。Keras 版本则使用Conv2D → MaxPooling2D → Conv2D → MaxPooling2D → Flatten → Dense(120) → Dense(84) → Dense(10, softmax)参数约 6.2 万。训练这类网络需要相当长的时间最好在支持 GPU 的计算环境上运行。用 SGDlr0.001, momentum0.9训练 3 个 epoch验证准确率约 52%用 Adam 训练 10 个 epoch验证准确率约 62%。看起来不高但请记住盲猜只有 10% 准确率而且 CIFAR-10 的难度远高于 MNIST 数字识别。在如此短的训练时间内突破 50%已经是相当不错的成果。运行环境准备要复现上述实验按 lessons/0-course-setup/how-to-run.md 的指引准备环境推荐安装 miniconda 后克隆仓库并用conda env create从 environment.yml 创建虚拟环境或在 VS Code Python 插件、本地 Jupyter、云端GitHub Codespaces、Binder、带 GPU 的云虚拟机等中运行.ipynb笔记本。课程依赖见 requirements.txt含 PyTorch 生态的torchinfo以及 Keras 3、TensorFlow 等。为便于阅读教程代码将训练辅助函数MNIST 加载、train/validate、结果绘图、卷积可视化封装在 pytorchcv.py 与 tfcv.py 中两个笔记本开头的load_mnist(batch_size128)即可一键加载数据。知名 CNN 架构纵览继续阅读 CNN_Architectures.md 可系统了解经典 CNN 架构。VGG-16VGG-16 是 2014 年 ImageNet Top-5 分类准确率达 92.7% 的网络。它遵循传统金字塔架构——卷积-池化层的序列图片来自 ResearchGateResNetResNet 是微软研究院 2015 年提出的模型家族核心思想是残差块residual blocks图片来自原始论文引入恒等直通identity pass-through的原因是让层去预测上一层结果与残差块输出之差——残差因此得名。这类块更易训练可以构造包含数百个残差块的网络常见变体有 ResNet-52、ResNet-101、ResNet-152。你也可以把它理解为网络能随数据集自动调整复杂度训练初期权重值小大部分信号经恒等直通层流过随着训练进行权重变大网络参数的作用增强网络调整自身以容纳足够表达能力来正确分类训练图像。Google InceptionGoogle Inception 架构更进一步把每一层构建为多条不同路径的组合图片来自 ResearchGate这里需要强调1×1 卷积的作用。乍看之下用 1×1 滤波器扫过图像没有意义但请记住卷积滤波器同时作用于多个深度通道最初是 RGB 颜色后续层是不同滤波器的通道1×1 卷积正是用不同的可训练权重把输入通道混合起来也可视为在通道维度上做下采样池化。MobileNetMobileNet 是一族体积精简、适合移动设备的模型。如果你资源紧张、愿意牺牲一点准确率可以选用它们。其核心思想是深度可分离卷积depthwise separable convolution——把卷积滤波器表示为空间卷积与 1×1 深度通道卷积的复合从而大幅减少参数数量使网络更小也更容易用较少数据训练。课后挑战与实战 Lab挑战两个笔记本末尾都有关于如何获得更高准确率的提示。做一些实验看看能否取得更高准确率例如 Keras 版建议用 3×3 滤波器训练同一网络并可视化是否看到更熟悉的模式。宠物品种分类 Lab打开 lab/README.md从 PetFaces.ipynb 开始。任务场景为宠物托儿所开发应用以登记所有宠物其中一个重要功能是根据照片自动识别品种。数据集使用 Oxford-IIIT Pet Dataset包含狗和猫的37 个品种图像。数据集按文件名组织如Abyssinian_1.jpg、Bengal_2.jpg笔记本内含把图像整理到品种子目录的代码下载!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz !tar xfz images.tar.gz !rm images.tar.gz要点这些图像比 MNIST 更复杂、维度更高且有超过 10 个类别。你将从零开始训练 CNN 解决这个相对复杂的图像分类问题。由于部分类别即使对人类也容易混淆测量 top-k 准确率也很有意义。复习与延伸思考CNN 最常用于计算机视觉任务但它们本质上擅长提取固定尺寸的模式。例如处理声音时也可以用 CNN 在音频信号中寻找特定模式——此时滤波器是 1 维的称 1D-CNN有时也用 3D-CNN 在多维空间提取特征比如在视频中捕捉某些随事件发生的特征变化模式。小结在本单元中我们学习了计算机视觉神经网络的核心概念——卷积网络。支撑图像分类、目标检测甚至图像生成的真实架构本质上都是 CNN 的扩展只是层数更多、加上一些额外训练技巧。理解了卷积滤波器、可训练卷积层、池化与金字塔架构再动手实现从单层 CNN 到 LeNet 的完整流程你就掌握了迈向现代视觉模型VGG、ResNet、Inception、MobileNet的基础能力。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐WeChatMsg新手完整指南一键导出微信聊天记录为HTML/Word/CSV并生成年度聊天报告WeChatMsg新手完整指南一键导出微信聊天记录为HTML/Word/CSV并生成年度聊天报告 为什么要把微信聊天记录导出成文件 你打开某个聊天框往回翻到如何用DeepLearningPython构建强大的卷积神经网络从LeNet到现代架构的完整指南如何用DeepLearningPython构建强大的卷积神经网络从LeNet到现代架构的完整指南 GitHub 加速计划 / de / DeepLearninL0CV项目中的经典卷积神经网络从LeNet到ResNet的PyTorch实现指南L0CV项目中的经典卷积神经网络从LeNet到ResNet的PyTorch实现指南 计算机视觉实战演练平台L0CV为初学者提供了完整的卷积神经网络学习体验从计算机视觉深度学习机器学习教程示例工程上一篇Scrypted终极指南从零搭建高性能NVR智能检测系统下一篇OpCore Simplify三步快速创建OpenCore EFI的黑苹果配置终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考