pytorch入门 - 基于AlexNet神经网络实现猫狗大战
基于之前的博客 pytorch入门 - AlexNet神经网络,并借助Kaggle 的 Dogs vs Cats Redux 数据集,实现一个基于 AlexNet 的二分类模型识别猫与狗。
完整流程涵盖数据准备、归一化、模型定义、训练增强、验证并可视化结果。
一、数据集准备与预处理
import os
import shutil
def split_data(ROOT_TRAIN):
cat_dir = os.path.join(ROOT_TRAIN, "cat")
dog_dir = os.path.join(ROOT_TRAIN, "dog")
os.makedirs(cat_dir, exist_ok=True)
os.makedirs(dog_dir, exist_ok=True)
for filename in os.listdir(ROOT_TRAIN):
if filename.startswith("cat") and filename.endswith(".jpg"):
shutil.move(os.path.join(ROOT_TRAIN, filename),
os.path.join(cat_dir, filename))
elif filename.startswith("dog") and filename.endswith(".jpg"):
shutil.move(os.path.join(ROOT_TRAIN, filename),
os.path.join(dog_dir, filename))
优化原因:
分类任务需明确标签与数据的对应关系。通过创建cat/dog子目录并移动图片,可直接利用PyTorch的ImageFolder自动生成标签,避免手动标注错误。
二、数据归一化参数计算
def compute_normalization_params(dataset_path):
transform = transforms.Compose([
transforms.Resize((227, 227)),
transforms.ToTensor()
])
dataset = ImageFolder(dataset_path, transform=transform)
loader = DataLoader(dataset, batch_size=32, num_workers=4, shuffle=False)
# 计算各通道均值和标准差
mean = 0.0
std = 0.0
for data, _ in loader:
batch_samples = data.size(0)
data = data.view(batch_samples, data.size(1), -1)
mean += data.mean(2).sum(0)
std += data.std(2).sum(0)
return mean / len(dataset), std / len(dataset)
关键点:
- 输入尺寸统一:AlexNet要求固定输入尺寸
227×227,需提前调整 - 通道级归一化:对RGB三通道分别计算均值和标准差,消除光照差异影响,加速模型收敛
- 离线计算:避免在训练时实时计算,提升数据加载效率
三、AlexNet模型针对性修改
class AlexNet(nn.Module):
def __init__(self):
super().__init__()
# 修改1:输入通道调整为3 (RGB)
self.conv1 = nn.Conv2d(3, 96, kernel_size=11, stride=4)
# ... (中间层省略)
# 修改2:输出层调整为2分类
self.fc3 = nn.Linear(4096, 2)
# 修改3:降低Dropout比例
self.dropout = nn.Dropout(0.2) # 原论文为0.5
优化逻辑:
- 输入通道适配:原始AlexNet针对ImageNet的1000类设计,此处调整为猫狗二分类,需修改输出层维度为2
- 降低过拟合风险:
- 猫狗数据集(25k张)远小于ImageNet(1400万张)
- 降低Dropout比例(0.5→0.2)可保留更多特征信息,避免模型欠拟合
- 权重初始化:采用Kaiming初始化,适配ReLU激活函数特性,缓解梯度消失
四、数据增强策略
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(p=0.5),
transforms.RandomRotation(10),
transforms.RandomResizedCrop(227, scale=(0.8, 1.0)),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),
transforms.ToTensor(),
transforms.Normalize(mean=[0.488, 0.455, 0.417],
std=[0.226, 0.221, 0.221])
])
增强目的:
- 提升泛化能力:通过旋转、裁剪、色彩扰动模拟真实场景的多样性,防止模型记忆固定模式
- 克服数据局限:小数据集易导致过拟合,增强后等效扩大数据规模
- 对齐测试环境:测试阶段采用相同预处理,保证输入分布一致性
五、训练过程优化
# 1. 学习率调整
optimizer = optim.Adam(model.parameters(), lr=1e-4) # 原常用值0.001
# 2. 训练-验证集拆分
train_data, val_data = random_split(dataset, [0.8, 0.2])
# 3. 早停机制
if val_acc > best_acc:
best_model_wts = copy.deepcopy(model.state_dict())
关键技术点:
- 低学习率策略:
- 预训练模型特征已较完备,降低学习率(1e-4)避免破坏已有特征
- 微调阶段需精细调整参数,高学习率易导致震荡
- 验证集独立划分:
- 20%数据作为验证集,实时监控模型泛化能力
- 避免测试集参与训练,保证评估客观性
- 混合精度训练(可选):
使用torch.cuda.amp自动混合精度,提升训练速度30%+(需GPU支持)
关键优化总结
| 优化点 | 原始值 | 调整值 | 作用 |
|---|---|---|---|
| 输入通道 | 1 (灰度) | 3 (RGB) | 适配彩色图像 |
| 输出维度 | 1000 | 2 | 二分类需求 |
| Dropout率 | 0.5 | 0.2 | 防欠拟合 |
| 学习率 | 0.001 | 0.0001 | 稳定微调 |
| 数据增强 | 无 | 5种变换 | 提升泛化性 |
pytorch入门 - 基于AlexNet神经网络实现猫狗大战的更多相关文章
- Pytorch实现基于卷积神经网络的面部表情识别(详细步骤)
文章目录 一.项目背景 二.数据处理 1.标签与特征分离 2.数据可视化 3.训练集和测试集 三.模型搭建 四.模型训练 五.完整代码 一.项目背景数据集cnn_train.csv包含人类面部表情的图 ...
- 基于卷积神经网络的面部表情识别(Pytorch实现)----台大李宏毅机器学习作业3(HW3)
一.项目说明 给定数据集train.csv,要求使用卷积神经网络CNN,根据每个样本的面部图片判断出其表情.在本项目中,表情共分7类,分别为:(0)生气,(1)厌恶,(2)恐惧,(3)高兴,(4)难过 ...
- pytorch 入门指南
两类深度学习框架的优缺点 动态图(PyTorch) 计算图的进行与代码的运行时同时进行的. 静态图(Tensorflow <2.0) 自建命名体系 自建时序控制 难以介入 使用深度学习框架的优点 ...
- Pytorch入门上 —— Dataset、Tensorboard、Transforms、Dataloader
本节内容参照小土堆的pytorch入门视频教程.学习时建议多读源码,通过源码中的注释可以快速弄清楚类或函数的作用以及输入输出类型. Dataset 借用Dataset可以快速访问深度学习需要的数据,例 ...
- 第一章:PyTorch 入门
第一章:PyTorch 入门 1.1 Pytorch 简介 1.1.1 PyTorch的由来 1.1.2 Torch是什么? 1.1.3 重新介绍 PyTorch 1.1.4 对比PyTorch和Te ...
- Pytorch入门随手记
Pytorch入门随手记 什么是Pytorch? Pytorch是Torch到Python上的移植(Torch原本是用Lua语言编写的) 是一个动态的过程,数据和图是一起建立的. tensor.dot ...
- 超简单!pytorch入门教程(五):训练和测试CNN
我们按照超简单!pytorch入门教程(四):准备图片数据集准备好了图片数据以后,就来训练一下识别这10类图片的cnn神经网络吧. 按照超简单!pytorch入门教程(三):构造一个小型CNN构建好一 ...
- PyTorch基础——机器翻译的神经网络实现
一.介绍 内容 "基于神经网络的机器翻译"出现了"编码器+解码器+注意力"的构架,让机器翻译的准确度达到了一个新的高度.所以本次主题就是"基于深度神经 ...
- PyTorch ImageNet 基于预训练六大常用图片分类模型的实战
微调 Torchvision 模型 在本教程中,我们将深入探讨如何对 torchvision 模型进行微调和特征提取,所有这些模型都已经预先在1000类的Imagenet数据集上训练完成.本教程将深入 ...
- pytorch入门2.0构建回归模型初体验(数据生成)
pytorch入门2.x构建回归模型系列: pytorch入门2.0构建回归模型初体验(数据生成) pytorch入门2.1构建回归模型初体验(模型构建) pytorch入门2.2构建回归模型初体验( ...
随机推荐
- kubectl
... Nodes k8s查看节点CPU消耗情况,可以用kubectl top命令,但是会出现 kubectl top nodes error: Metrics API not available 退 ...
- FastAPI中实现动态条件必填字段的实践
title: FastAPI中实现动态条件必填字段的实践 date: 2025/04/03 00:06:20 updated: 2025/04/03 00:06:20 author: cmdragon ...
- nginx中的路径匹配规则详解(location规则)
Nginx的路径匹配规则 Nginx的匹配规则用location指令来实现,Nginx 的location指令用于匹配请求的 URI(请求路径),并根据匹配结果执行特定的处理指令.location是实 ...
- EagleOS 9.5-基于AlmaLinux 9.5深度定制优化
EagleOS 9.5 说明文档 一.系统简介 EagleOS 9.5基于AlmaLinux 9.5进行深度定制优化. EagleOS 9.5根据AlmaLinux 9.5官方AlmaLinux-9. ...
- DotNetGuide 突破了 8K + Star,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库!
前言 转眼之间维护DotNetGuide(全面的C#/.NET/.NET Core学习.工作.面试指南知识库)已经持续超过了4年多的时间,Commit提交数也超过1400+,在前几天在 GitHub ...
- TensorFlow重新导入restore报错: OP_REQUIRES failed at save_restore_v2_ops.cc:184 : Not found: Key Variable not found in checkpoint
最近在解决TensorFlow模型重新导入时遇到下面这个问题,发现网上很多解决办法都在误导,其实报错已经很明显说明问题的根源,只是我们不一定找到问题的根源.报错显示 不能在快照中找到 对应的键值. 报 ...
- public void add(int index, E element)的方法源码分析
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess ...
- eolinker同一个自动化用例内执行不同端接口遇到的问题(主要是两套host环境共存的问题)解决方法
特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html eolinker内同一套环境只能配置一个host地址,如 ...
- 最新最完整的iphone开发ios开发证书/发布证书/推送证书/企业证书和描述文件制作方法与教程
本文介绍最新的最全的如何制作 iOS 证书(开发证书.发布证书.推送证书,企业证书)和iphone配置描述文件,用于iphone和ipad开发构建 IOS App 应用.如果嫌麻烦,可以使用懒人工具a ...
- Asp.net core 少走弯路系列教程(五)HTTP 协议学习
前言 新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力. 新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马. 作者认 ...