A029-AlexNet模型实现鸟类识别.md

A029-AlexNet模型实现鸟类识别

视频课程:https://www.bilibili.com/video/BV1mveqzXE2n/

【购买前必看】

1、关于我们

深度学习乐园是由python哥全职技术团队组建运营【团队成员为:复旦大学博士、华东理工爱丁堡博士、格拉斯哥博士、纽约大学硕士、浙江大学硕士】。

我们只做python业务,精通sklearn机器学习/torch深度学习/django/flask/vue全栈开发。

2、关于项目

我们从2018年开始,就专注于深度学习sci、ei、ccf、kaggle等,至今已有7年,共发表过10多篇顶刊顶会。

官网累积了数百个项目,已有3000多学员付费购买,圈子内有口皆碑:www.zzgcz.com (更多高级私密项目无法对外,联系微信定制:zzgcz_com

3、售后承诺

包远程安装调试,所有项目均在本地运行通过,大部分都有截图和录屏。

支持二次修改,所有项目都是我们自己写的,改起来也非常容易。

加急定制1-2天可完成,这就是实力证明,远程验收满意后再付全款!

所有客户终身售后。兼职的人家都有主业,谁愿意持续服务你?

1. 项目简介

本项目旨在使用 PyTorch 框架手写实现经典的 AlexNet 卷积神经网络,并在一个自建的鸟类图像数据集上完成分类任务。

  • 数据集位于 ./bird_photos/,其中每个子文件夹对应一个鸟类类别。

  • 模型从零开始训练,未使用预训练权重。

  • 项目最终目标是:输入任意一张鸟类图像,输出其所属类别及预测置信度。

Image Token: TNnEb5YfkopOzAxK16NcUWodnjb


2. 技术要点

  • 自定义 AlexNet 实现

  • 五个卷积层 + 三个全连接层的经典架构。

  • 输入固定为 224×224,输出为类别数。

  • 数据划分与增强

  • 使用 sklearn.model_selection.train_test_split,分层抽样保证各类别比例一致。

  • 数据增强:随机裁剪缩放、水平翻转、颜色抖动。

  • 训练优化

  • 优化器:Adam(lr=3e-4, weight_decay=1e-4)

  • 调度器:CosineAnnealingLR,随 epoch 递减学习率。

  • 混合精度训练:torch.amp.autocast("cuda") + GradScaler

  • 可复现性与加速

  • 固定随机种子 seed=42

  • 启用 cudnn.benchmark=True 提升 GPU 卷积计算效率。


3. 数据集与预处理

  • 目录结构

  • bird_photos/ ├─ Bananaquit/ ├─ Cardinal/ ├─ BlueJay/ └─ Sparrow/

  • 划分比例:训练集 80%,验证集 20%。

  • 图像预处理

  • 训练集

    • RandomResizedCrop(224, scale=(0.7,1.0))

    • RandomHorizontalFlip()

    • ColorJitter()

    • ToTensor() + Normalize(mean, std)

  • 验证集

    • Resize(256) → CenterCrop(224)

    • ToTensor() + Normalize(mean, std)

  • 标准化参数

  • 均值:[0.485, 0.456, 0.406]

  • 方差:[0.229, 0.224, 0.225]


4. 模型结构

AlexNet(PyTorch 实现)

  • 特征提取部分 (features):

  • Conv1:输入 3 通道,输出 64,卷积核 11×11,stride=4,padding=2 → ReLU → MaxPool(3, stride=2)

  • Conv2:64→192,5×5,padding=2 → ReLU → MaxPool(3, stride=2)

  • Conv3:192→384,3×3,padding=1 → ReLU

  • Conv4:384→256,3×3,padding=1 → ReLU

  • Conv5:256→256,3×3,padding=1 → ReLU → MaxPool(3, stride=2)

  • 分类部分 (classifier):

  • Flatten → 256×6×6=9216

  • Linear(9216, 4096) → ReLU → Dropout(0.5)

  • Linear(4096, 4096) → ReLU → Dropout(0.5)

  • Linear(4096, num_classes)


5. 训练流程

5.1 损失与优化

  • 损失函数:CrossEntropyLoss()

  • 优化器:Adam,学习率 3e-4

  • 学习率调度:CosineAnnealingLR

5.2 训练循环

  • 每个 epoch 执行:

  • 前向传播 (autocast 混合精度)

  • 反向传播 (scaler.scale)

  • 更新参数 (optimizer.step())

  • 每轮结束后:

  • 计算训练集平均损失与精度

  • 在验证集上评估并保存最佳模型权重

5.3 模型保存

  • 最佳模型:

  • 路径:outputs/best_alexnet_from_scratch.pth

  • 保存内容:state_dict、类别标签、验证集最佳精度、配置参数等。


6. 推理与应用

单图推理函数

predict_image(model_path, image_path)

  • 输入:模型路径 + 图像路径

  • 输出:预测类别名称、置信度

  • 示例:

predict_image("outputs/best_alexnet_from_scratch.pth","./bird_photos/Bananaquit/001.jpg") # => Prediction: Bananaquit (confidence=0.9821)


7. 结果与可视化

  • 日志输出:每轮打印训练/验证损失与精度

  • Epoch 01/5 | train_loss 1.2345 acc 0.5678 | val_loss 1.0123 acc 0.6789

  • 保存文件

  • best_alexnet_from_scratch.pth → 模型参数

  • 可扩展添加:Loss/Acc 曲线、混淆矩阵、预测样例图


8. 优缺点评价

优点

  1. 结构清晰:手写 AlexNet,便于理解经典 CNN 设计思想。

  2. 增强鲁棒性:数据增强与分层划分提高泛化能力。

  3. 训练效率高:AMP 混合精度与 Adam 优化器加速收敛。

  4. 可扩展性强:易于添加更多可视化或替换更现代的骨干网络。

缺点

  1. 参数量大:尤其是两个全连接 4096 层,计算开销高。

  2. 缺少正则化技巧:未引入 BatchNorm、Label Smoothing 等。

  3. 精度受限:相较现代网络(ResNet/EfficientNet)准确率偏低。

改进方向

  • 引入 BatchNorm、SE-Block 或注意力机制

  • 尝试 更轻量的网络(MobileNet、EfficientNet)

  • 使用 更多数据增强(Mixup、CutMix)

  • 增加 可视化模块(Grad-CAM、特征图展示)