P2:CIFAR10彩色图片识别

前言
CIFAR-10数据集是深度学习领域的经典基准任务之一,包含10个类别的6万张32×32彩色图像。作为计算机视觉的入门实验,CIFAR-10分类任务能够帮助我们从零开始理解卷积神经网络(CNN)的核心原理,掌握数据预处理、网络构建、训练优化等全流程技术。
本实验旨在通过手动推导卷积层与池化层的计算过程,深入理解CNN的特征提取机制,并实践如何从理论过渡到代码实现。通过构建一个完整的CNN模型,我们将熟悉PyTorch框架的使用,为后续复杂视觉任务奠定基础。

实验概述

一、实验目标

1.掌握CIFAR-10数据集的加载、可视化与预处理方法。
2.使用深度学习框架PyTorch构建CNN模型,实现端到端训练与测试。
3.手动推导卷积层、池化层的数学计算过程(如输出尺寸、参数量)。

二、卷积层、池化层的计算

下面的网络数据shape变化过程为:
3, 32, 32(输入数据)
-> 64, 30, 30(经过卷积层1)-> 64, 15, 15(经过池化层1)
-> 64, 13, 13(经过卷积层2)-> 64, 6, 6(经过池化层2)
-> 128, 4, 4(经过卷积层3) -> 128, 2, 2(经过池化层3)
-> 512 -> 256 -> num_classes(10)
手动计算过程:
在这里插入图片描述

三、我的环境:

● 语言环境:Python3.8
● 编译器:jupyter notebook
● 深度学习环境:Pytorch

四、构建简单的CNN网络

对于一般的CNN网络来说,都是由特征提取网络和分类网络构成,其中特征提取网络用于提取图片的特征,分类网络用于将图片进行分类。

函数:

1.torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=‘zeros’, device=None, dtype=None)

关键参数说明:
● in_channels ( int ) – 输入图像中的通道数
● out_channels ( int ) – 卷积产生的通道数
● kernel_size ( int or tuple ) – 卷积核的大小
● stride ( int or tuple , optional ) – 卷积的步幅。默认值:1
● padding ( int , tuple或str , optional ) – 添加到输入的所有四个边的填充。默认值:0
● dilation (int or tuple, optional) - 扩张操作:控制kernel点(卷积核点)的间距,默认值:1。
● groups(int,可选):将输入通道分组成多个子组,每个子组使用一组卷积核来处理。默认值为 1,表示不进行分组卷积。
● padding_mode (字符串,可选) – ‘zeros’, ‘reflect’, ‘replicate’或’circular’. 默认:‘zeros’

2.torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)

关键参数说明:
● in_features:每个输入样本的大小
● out_features:每个输出样本的大小

torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

关键参数说明:
● kernel_size:最大的窗口大小
● stride:窗口的步幅,默认值为kernel_size
● padding:填充值,默认为0
● dilation:控制窗口中元素步幅的参数

代码实现

一、前期准备

1.设置GPU

在这里插入图片描述

2.导入数据

使用dataset下载CIFAR10数据集,并划分好训练集与测试集
使用dataloader加载数据,并设置好基本的batch_size

3.数据可视化

transpose((C, H, W))详解:
● 作用是对NumPy数组进行轴变换,transpose函数的参数是一个元组,定义了新轴的顺序。原始PyTorch张量通常是以(C, H, W)的格式存储的,其中:
○ C是通道数。
○ H是图像的高度。
○ W是图像的宽度。
在这里插入图片描述

二、模型构建

构建简单的CNN网络
网络分为两部分:
特征提取网络:交替使用卷积层和池化层。
分类网络:全连接层进行分类。
在这里插入图片描述

三、训练模型

1.设置超参数

在这里插入图片描述

2.编写训练函数

optimizer.zero_grad()
函数会遍历模型的所有参数,通过内置方法截断反向传播的梯度流,再将每个参数的梯度值设为0,即上一次的梯度记录被清空。

loss.backward()
PyTorch的反向传播(即tensor.backward())是通过autograd包来实现的,autograd包会根据tensor进行过的数学运算来自动计算其对应的梯度。

optimizer.step()
step()函数的作用是执行一次优化步骤,通过梯度下降法来更新参数的值。因为梯度下降是基于梯度的,所以在执行optimizer.step()函数前应先执行loss.backward()函数来计算梯度。

注意:optimizer只负责通过梯度下降进行优化,而不负责产生梯度,梯度是tensor.backward()方法产生的。
在这里插入图片描述

3.编写测试函数

测试函数和训练函数大致相同,但是由于不进行梯度下降对网络权重进行更新,所以不需要传入优化器
在这里插入图片描述

4.正式训练

在这里插入图片描述

四、结果可视化

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值