教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本篇文章基于 AI-For-Beginners 课程中「卷积神经网络07-ConvNets」单元的配套实验室作业展开围绕一个非常贴近实际业务的问题为宠物托儿所应用构建「从照片自动识别猫狗品种」的功能。你将学习如何使用 Oxford-IIIT Pet Dataset 训练一个多类别 CNN 图像分类器并掌握数据整理、TensorFlow / PyTorch 双框架实现、过拟合监控、Top-3 精度评估与猫狗二分类扩展的完整流程。读完本文你能够独立复现并在此基础上改进这套端到端的品种识别实验。实验背景与任务设定实验设想你正在为一家宠物托儿所开发应用需要把所有宠物登记造册。其中一个核心亮点功能是仅凭一张照片自动识别宠物的品种breed。这是一个典型的图像分类问题借助卷积神经网络CNN可以很好地完成。具体任务如下原文见 translations/es/lessons/4-ComputerVision/07-ConvNets/lab/README.md训练一个卷积神经网络使用Pet Faces数据集对不同品种的猫和狗进行分类。与 MNIST 手写数字这类「玩具级」任务不同本实验的类别数多达 37 个品种图像为真实的彩色照片尺寸更大、类间差异也更细微例如同属梗犬的不同品种因此是检验 CNN 特征提取与泛化能力的合适场景。数据集Oxford-IIIT Pet Dataset实验使用 Oxford-IIIT Pet Dataset其中包含37 个不同品种的猫和狗的图像。该数据集的一个特点是图像按文件名组织例如Abyssinian_1.jpg、Bengal_2.jpg品种信息隐藏在文件名中而不是按品种放在子目录里——这意味着实验的第一步就是按品种重新整理目录结构详见下文「按品种整理目录」一节。下图展示了实验中将要处理的数据样本每张图片上方标注了cat_品种名/dog_品种名覆盖阿比西尼亚猫、暹罗猫、缅因猫、拳师犬、萨摩耶犬、柴犬等多个品种下载数据集在 Notebook 中执行以下命令即可完成下载、解压与清理来自实验起始 Notebook PetFaces.ipynb 的第 1 个代码单元!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz !tar xfz images.tar.gz !rm images.tar.gz解压后会生成名为images的目录其中即为全部品种的宠物照片。数据预处理按品种整理目录与可视化由于原始图片文件名形如Abyssinian_1.jpg而torchvision.datasets.ImageFolder与tf.keras.preprocessing.image_dataset_from_directory等深度学习框架的数据加载工具都要求按类别子目录组织因此 Notebook 提供了专门代码把图片按品种移动到petfaces/品种名/子目录下。核心逻辑是品种名 文件名中最后一个下划线及编号之前的所有部分例如Abyssinian_1.jpg→ 品种Abyssinian为每个品种创建子目录并把原文件移动进去。对应实现PetFaces.ipynb第 5 个代码单元大致如下import os if not os.path.exists(petfaces): os.makedirs(petfaces) for img_file in os.listdir(images): if img_file.endswith((.jpg, .png)): # 品种名 去掉末尾的 _编号 breed _.join(img_file.split(_)[:-1]) breed_dir os.path.join(petfaces, breed) if not os.path.exists(breed_dir): os.makedirs(breed_dir) os.rename(os.path.join(images, img_file), os.path.join(breed_dir, img_file))整理完成后Notebook 定义了一个通用的图像展示函数display_images用于逐类打印前若干张图片直观检查数据是否完整、是否有异常图像import matplotlib.pyplot as plt import os from PIL import Image import numpy as np def display_images(l, titlesNone, fontsize12): n len(l) fig, ax plt.subplots(1, n) for i, im in enumerate(l): ax[i].imshow(im) ax[i].axis(off) if titles is not None: ax[i].set_title(titles[i], fontsizefontsize) fig.set_size_inches(fig.get_size_inches() * n) plt.tight_layout() plt.show()最后用num_classes len(os.listdir(petfaces))统计类别总数作为后续设计网络输出层神经元数目的依据。加载深度学习数据集TensorFlow 与 PyTorch 两种路径把图片组织成类别子目录后就可以用框架自带的数据加载工具把图像批量转换为张量Tensor了。Notebook 明确指出两种主流方案TensorFlowtf.keras.preprocessing.image_dataset_from_directoryPyTorchtorchvision.datasets.ImageFolder。由于数据集中的图片基本都是接近正方形的比例需要把所有图片统一缩放到固定尺寸并组织成小批量minibatch供训练使用。实验中这两步# CODE TO LOAD DATASET留给读者自行完成属于刻意设计的「填空题」。结合本课讲义 Notebook 中的既有用法可以给出如下参考写法TensorFlow 参考见 ConvNetsTF.ipynb 与 tfcv.py 中load_cats_dogs_dataset的用法ds_train tf.keras.preprocessing.image_dataset_from_directory( petfaces, validation_split0.2, subsettraining, seed13, image_size(224, 224), batch_size32, )PyTorch 参考见 pytorchcv.py 中common_transform与load_cats_dogs_dataset的用法transform torchvision.transforms.Compose([ torchvision.transforms.Resize((224, 224)), torchvision.transforms.ToTensor(), ]) dataset torchvision.datasets.ImageFolder(petfaces, transformtransform)提示PyTorch 的ImageFolder会按子目录名自动生成类别索引即label 0, 1, 2, ...与品种名一一对应TensorFlow 的image_dataset_from_directory行为类似。训练集 / 测试集划分加载完整数据集后需要拆分为训练集和测试集# CODE TO DO TRAIN/TEST SPLIT。PyTorch 可用torch.utils.data.random_split按比例随机划分如train_len int(0.8 * len(dataset)) test_len len(dataset) - train_len trainset, testset torch.utils.data.random_split(dataset, [train_len, test_len])张量形状自查Notebook 给出了一个实用的「对答案」标准训练前务必打印张量形状确认一切正确图像张量应为(batch_size, image_size, image_size, 3)TensorFlow或(batch_size, 3, image_size, image_size)PyTorch其中3是 RGB 颜色通道数标签张量应为(batch_size,)且元素是类别编号0 ~ num_classes-1而非 one-hot 向量。设计卷积神经网络实验中要求读者自行定义 CNN 结构# CODE TO DEFINE NEURAL NETWORKNotebook 给出了三条关键设计准则与讲义 07-ConvNets README 中介绍的金字塔架构pyramid architecture完全一致滤波器数量随网络加深而增加浅层用 8~16 个滤波器提取水平线、垂直线等低级像素组合越往深层空间尺寸被池化缩小滤波器数量增长用于组合出更高层的图案层与层之间要有激活函数ReLU和最大池化Max Pooling池化用于降低空间维度同时保留「窗口内存在某种图案」的信息输出神经元数量必须等于类别数最后的分类头可以有也可以没有隐藏层但输出维度必须与num_classes一致。最后一层激活函数与损失函数的正确搭配这是实验中反复强调的一个容易出错点TensorFlow最后一层使用softmax激活配合sparse_categorical_crossentropy损失。sparse版本的差异在于它直接接受「类别编号」而非 one-hot 编码向量讲义 ConvNetsTF.ipynb 中则使用SparseCategoricalCrossentropy(from_logitsTrue)的等价写法PyTorch最后一层不加激活函数直接使用nn.CrossEntropyLoss作为损失——该损失函数内部会自动应用 softmax。参考实现从单卷积层到多层金字塔 CNN讲义 ConvNetsPyTorch.ipynb 给出了两个可以直接迁移到本实验的参考结构单卷积层网络OneConv——28×28 灰度图、9 个 5×5 滤波器、展平后接全连接层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多层金字塔 CNNMultiLayerCNN——两个卷积层交替池化、滤波器数逐层翻倍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这两个例子中有几点值得借鉴到 Pet Faces 实验池化层因为不含可训练参数可以只定义一个实例反复复用卷积层参数量远小于全连接层使得网络总参数量大幅下降MultiLayerCNN 仅约 8.5K 参数这有利于在小数据集上抑制过拟合。对于本实验的彩色图像只需把Conv2d的in_channels从 1 改为 3并把最后的fc输出维度改成num_classes即可。若想进一步了解更深的经典结构VGG-16、ResNet、Inception、MobileNet可阅读补充资料 CNN_Architectures.md。训练网络与监控过拟合网络定义好后即可开始训练# TRAIN THE NETWORK。Notebook 要求在每个 epoch 同时记录训练集与验证集的精度训练结束后绘制两条精度曲线用于观察是否存在过拟合若训练精度持续上升而验证精度停滞甚至下降则说明模型过拟合可采取的改进手段包括增加数据增强、使用更多卷积层 / Dropout、减小滤波器尺寸、缩小 batch size、降低学习率、提前停止early stopping等。GPU 加速的正确姿势Notebook 特别强调了一个跨框架差异TensorFlow / Keras会自动检测并使用 GPUPyTorch需要手动调用.to()方法把模型和数据都搬到 GPU 上否则无法享受 GPU 加速。参考讲义辅助模块 pytorchcv.py 中train_epoch的实现正确的训练循环骨架如下default_device cuda if torch.cuda.is_available() else cpu for features, labels in train_loader: optimizer.zero_grad() lbls labels.to(default_device) out net(features.to(default_device)) # 输入也要搬到 GPU loss loss_fn(out, lbls) loss.backward() optimizer.step()注意其中net在创建后也需要调用net.to(default_device)完成迁移并且验证阶段要用with torch.no_grad()包裹、调用net.eval()关闭 dropout / batch norm 的训练行为见 pytorchcv.py 中的validate函数。评估为什么需要 Top-3 精度实验中一个重要的「进阶思考」是类别数较多Notebook 评估时提到整理后约 35 个类时标准精度top-1过于严苛。例如两个外观相似的品种模型输出概率可能分别是 0.45 与 0.43此时即使模型已经「很接近」按 top-1 判定仍然是错误。因此常用top-k 精度衡量只要正确标签出现在模型概率最高的前 3 个预测中就计为正确。Notebook 给出的计算提示如下# CALCULATE TOP-3 ACCURACYTensorFlow用tf.nn.in_top_k(predictions, targets, k3)判断每个样本的正确标签是否落在前 k 名返回布尔张量用tf.cast转成 0/1 后累加、tf.reduce_sum汇总PyTorch用torch.topk(output, 3, dim1)取出概率最高的 3 个类别索引再判断正确类别是否包含其中。手工逐样本推理、累计命中数再除以样本总数即可得到测试集上的 top-3 精度。由于类别多、品种差异细微这个指标通常明显高于 top-1也更能反映模型「可用性」。可选扩展猫 vs 狗二分类实验最后提供了一个可选任务在同一数据集上验证二分类猫 vs 狗的精度。实现要点# Define dataset that contains only two labels: 0 cat, 1 dog把标签压缩为两个0 cat、1 dog利用品种名前缀判断本数据集中猫品种名以cat_开头、狗品种名以dog_开头从数据样本图也可以看到cat_Ragdoll、dog_boxer这样的标注然后复用同样的 CNN 结构把输出层改为 2 个神经元重新训练比较二分类与 37/35 类多分类的精度差异体会类别数对任务难度的影响。总结本实验覆盖了一条完整的 CNN 图像分类流水线数据下载 → 按类别整理目录 → 框架化批量加载 → 训练/测试划分 → 金字塔式 CNN 设计 → 训练与过拟合分析 → Top-3 精度评估 → 二分类扩展。在类别多达 37 种、且存在大量易混淆品种的情况下CNN 仍然能够取得合理精度这正体现了卷积网络在特征提取与泛化上的优势。想继续深入可以从头运行实验 NotebookPetFaces.ipynb实验中含多处# CODE TO ...待填写单元格复习卷积、滤波器与金字塔架构的理论讲解07-ConvNets README完成讲义配套的 PyTorch 卷积网络 Notebook 与 TensorFlow 卷积网络 Notebook并对比两个框架在滤波器可视化、参数量与训练速度上的异同尝试在实验基础上挑战更高的验证精度例如引入数据增强、更深的金字塔结构或尝试经典架构如 VGG、ResNet并用 Top-3 指标评估改进效果。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI for Beginners 实验精讲用卷积神经网络从零实现宠物品种分类Pet Faces CNN LabAI for Beginners 实验精讲用卷积神经网络从零实现宠物品种分类Pet Faces CNN Lab 本文基于 AI for Beginners教程人工智能机器学习深度学习AI for Beginners CNN 实验用 Pet Faces 数据集从零训练卷积神经网络识别猫狗品种AI for Beginners CNN 实验用 Pet Faces 数据集从零训练卷积神经网络识别猫狗品种 本篇技术指南对应 AI for Beginner教程人工智能机器学习深度学习AI-For-Beginners 宠物品种 CNN 实验基于 Pet Faces 数据集的多类别图像分类实战AI For Beginners 宠物品种 CNN 实验基于 Pet Faces 数据集的多类别图像分类实战 本篇技术文章基于 AI For Beginner教程人工智能机器学习深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考