计算机视觉技术实战 课件 项目2 图像分类:基于ResNet-18的时尚商品识别_第1页
计算机视觉技术实战 课件 项目2 图像分类:基于ResNet-18的时尚商品识别_第2页
计算机视觉技术实战 课件 项目2 图像分类:基于ResNet-18的时尚商品识别_第3页
计算机视觉技术实战 课件 项目2 图像分类:基于ResNet-18的时尚商品识别_第4页
计算机视觉技术实战 课件 项目2 图像分类:基于ResNet-18的时尚商品识别_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目2图像分类:基于ResNet-18的时尚商品识别教学目标能力目标(1)掌握Pytorch内置数据集的加载和预处理。(2)理解ResNet-18的基本结构和工作原理。(3)掌握Pytorch预训练模型的选择和微调方法。(4)掌握TensorBoard可视化工具的安装和使用。(5)熟悉使用ResNet-18预训练模型进行图像分类。知识目标(1)掌握解决图像分类任务的基本步骤和实际操作技能。(2)为进一步深入学习更复杂的视觉任务打下坚实的基础。工程目录图2-1是项目的主要文件和目录结构。其中dataset为存放数据集的目录,model为存放模型文件的目录,logs为存放TensorBoard日志文件的目录。ResNet18.ipynb和ResNet18.py为本项目的主要代码文件,两者内容一致,前者用于jupyter交互执行,更加直观;后者用于脚本执行,更加高效。

+--Project2_ImageClassification/|+--dataset/||+--FashionMNIST/|+--logs/|+--model/||--model_val81.3.pth||--model_val90.05.pth|--RestNet18.ipynb|--RestNet18.py

图2-1项目的主要文件和目录结构目录2TensorBoard的安装与使用1认识数据集Fashion-MNIST和预训练模型ResNet-183模型训练与评估目录2TensorBoard的安装与使用3模型训练与评估1认识数据集Fashion-MNIST和预训练模型ResNet-181.认识数据集Fashion-MNIST和预训练模型ResNet-18任务目标(1)了解Fashion-MNIST数据集的来源、收集方式和组成结构。(2)了解ResNet-18的网络结构及特点。1.1Fashion-MNIST数据集介绍

Fashion-MNIST数据集是由Zalando(一家德国的时尚科技公司)旗下的研究部门提供。其涵盖了来自10种类别的共7万个不同商品的正面图像,每个类别有7,000张图像,每张图像的分辨率为28x28像素。目前Fashion-MNIST已经内置到各个深度学习框架中,包括Pytorch。原始数据集按60000/10000的训练测试数据划分,同时每个训练和测试样本都按照表2-1的类别进行了标注。表2-1标注编号的含义标注编号描述0T-shirt/top(T恤)1Trouser(裤子)2Pullover(套衫)3Dress(裙子)4Coat(外套)5Sandal(凉鞋)6Shirt(汗衫)7Sneaker(运动鞋)8Bag(包)9Ankleboot(踝靴)数据集来源1.1Fashion-MNIST数据集介绍

数据集展示图2-2数据集样例展示1.2ResNet-18算法简介

ResNet-18(ResidualNetwork-18)是深度卷积神经网络(CNN)的一种架构,它是ResNet系列中的一员,由微软亚洲研究院的研究人员KaimingHe等四名华人于2015年提出。ResNet的设计基于残差学习(ResidualLearning)的思想,这一思想的提出在深度学习领域具有重大影响。ResNet的核心思想是通过引入残差块(ResidualBlocks)和批归一化(BatchNormalization)来解决深度神经网络训练时的梯度消失或爆炸和退化问题(degradationproblem)。传统的深度神经网络由于层数较深,在反向传播时,梯度可能变得非常小,导致网络难以训练。ResNet通过在网络中引入跳跃连接(SkipConnections)来允许信息在不同层之间直接传递,从而减轻了这一问题。残差块结构如图2-3所示。在残差块中,输入x通过两个或多个卷积层后,与原始输入相加,然后通过激活函数relu进行输出。这种直接的跨层连接允许梯度在网络中更容易地传播,减轻了梯度消失或爆炸问题,从而使得深层网络更容易训练。图2-3残差块结构示意图1.2ResNet-18算法简介

ResNet-18的主要特点包括:(1)深度。ResNet-18包括18个层(指的是带有权重的18层,包括卷积层和全连接层,不包括池化层和BN层),因此属于相对较深的网络。这使得它在提取高级特征和模型的表达能力方面非常强大。(2)残差块。网络中的基本构建块是残差块,每个残差块包括两个卷积层,每个卷积层后面跟着一个批量归一化层(BatchNormalizationLayer)和ReLU激活函数。跳跃连接将输入直接加到这些层的输出上,然后通过另一个ReLU激活函数。这样的设计不仅有助于缓解梯度消失问题,还能提高模型的泛化能力。(3)全局平均池化。ResNet-18使用全局平均池化来减小特征图的尺寸,将每个特征图的平均值作为最终输出的特征表示。(4)多通道。ResNet-18的输入可以是多通道的,适用于彩色图像等多通道数据。(5)预训练模型。由于其卓越的性能,ResNet-18经常用于计算机视觉任务,并且在大型图像数据集上进行了预训练。预训练的ResNet-18模型可以用作迁移学习的基础。1.2ResNet-18算法简介

ResNet在图像分类、物体检测、语义分割等计算机视觉任务中取得了卓越的成绩,并广泛用于各种应用程序中。由于其网络结构相对较小,ResNet-18通常比更大的ResNet变体(如ResNet-50)更适合于计算资源受限的环境。不同ResNet变体的结构如图2-4所示,在实际应用中,需根据真实场景需求选择对应规模的ResNet变体。其中“layer_name”代表网络层名称,“output_size”代表该层网络输出大小。图2-4ResNet不同变体的结构目录3模型训练与评估1认识数据集Fashion-MNIST和预训练模型ResNet-182TensorBoard的安装与使用2.TensorBoard的安装与使用

任务目标(1)了解TensorBoard在深度学习中的作用。(2)掌握TensorBoard的安装和使用。2.1TensorBoard简介

TensorBoard是一个优秀的用于可视化度量模型性能的工具,它提供了丰富的可视化功能,用于监控训练和评估过程、查看模型架构、分析损失和指标等,从而提高深度学习项目的效率。TensorBoard原本是内置在另一个流行的开源深度学习框架Tensorflow中,后来经过多方的努力,其他深度学习框架也可以使用TensorBoard的功能,因而Pytorch同样支持TensorBoard。TensorBoard可视化工具包至少提供以下功能:(1)跟踪和可视化损失及准确率等指标(2)可视化模型图(操作和层)(3)查看权重、偏差或其他张量随时间变化的直方图(4)将嵌入向量投射到较低的维度空间(5)显示图片、文字和音频数据2.2TensorBoard安装

TensorBoard的安装非常简单,按PyTorch官方文档说明,直接执行下面命令安装即可(在安装之前,有必要先激活项目1中创建的虚拟环境):

pipinstalltensorboardX2.3TensorBoard使用

1.

导入必要的库

在PyTorch代码中,导入必要的库:fromtorch.utils.tensorboardimportSummaryWriter2.

创建SummaryWriter

在代码中创建一个SummaryWriter对象,该对象将负责将PyTorch的信息写入TensorBoard日志文件。writer=SummaryWriter('logs')3.

记录信息到TensorBoard

在循环训练任务中,使用SummaryWriter对象记录想要在TensorBoard中可视化的信息,以下是训练任务中最常用到的几种记录函数:writer.add_scalar(tag='Loss/train',scalar_value=running_loss,global_step=epoch)writer.add_image(tag='image',img_tensor=images,global_step=epoch)writer.add_graph(model=resnet18,input_to_model=images)使用`add_scalar`来记录标量(如损失值、准确率等)。通过此记录可以直观地看到损失值、准确率等指标随epoch的变化。使用`add_images`来记录图像。如果希望查看数据查找问题,或者查看样本以确保数据质量,则可以使用此方法。使用`add_graph`来记录模型的结构和数据流。所有模型都可以看作是一个计算图,通过此方法进行可视化可以直观地了解模型的体系结构。在PyTorch中使用TensorBoard进行训练过程和模型的可视化非常简单,执行以下步骤:这里,'logs'是一个目录,TensorBoard将把日志文件写入该目录。

2.3TensorBoard使用

(1)在浏览器中查看TensorBoard。打开一个终端,导航到包含日志目录的位置(在本例中为'logs'),然后运行以下命令启动TensorBoard:tensorboard--logdir=logs

这将启动TensorBoard服务器,默认情况下在http://localhost:6006上。然后,打开Web浏览器,导航到http://localhost:6006,就能够看到TensorBoard界面,并查看记录的信息。%load_exttensorboard#加载TensorBoard扩展%tensorboard--logdirlogs

#启动并在jupyter展示TensorBoard页面通过以上步骤,就可以使用TensorBoard来可视化PyTorch模型的训练过程,包括损失曲线、模型等,如图2-5所示。有以下两种方法启动和查看TensorBoard:

(2)在jupyter中查看TensorBoard。在jupyter运行以下命令启动TensorBoard:图2-5TensorBoard展示图-损失曲线目录3模型训练与评估1认识数据集Fashion-MNIST和预训练模型ResNet-182TensorBoard的安装与使用3.模型训练与评估

任务目标(1)掌握PyTorch内部集成的数据集的用法。(2)掌握PyTorch中图像数据增强的用法。(3)了解预训练模型和微调的概念。(4)掌握PyTorch中预训练模型ResNet-18的微调和评估。(5)掌握PyTorch中随机剃度下降(SGD)优化算法的用法。3.1数据准备和预处理-读取和下载数据集

右侧代码将分别下载Fashion-MNIST数据集的训练集和测试集,并根据指定的目录存放,同时完成数据增强预处理操作。数据增强(DataAugmentation)是深度学习中的一种重要技术,它通过对训练数据进行一系列随机变换和扩充,以生成更多的训练样本,从而改善模型的性能和泛化能力。代码对训练数据集进行了随机水平翻转、随机垂直翻转、随机旋转等数据增强操作,读者们可以积极探索更多的数据增强方法,找到不同应用场景的适用数据增强方法。fromtorch.utils.dataimportDataLoaderfromtorchvisionimportdatasets,transforms#数据预处理train_transform=transforms.Compose([transforms.RandomHorizontalFlip(p=0.3),#以概率30%对图像进行水平翻转

transforms.RandomVerticalFlip(p=0.3),#以概率30%对图像进行垂直翻转

transforms.RandomRotation(degrees=30),#随机旋转图像30度以内

transforms.ToTensor(),#转换为

PyTorch张量

transforms.Normalize((0.5,),(0.5,))#以均值为0.5、标准差为0.5进行归一化])test_transform=transforms.Compose([transforms.ToTensor(),#转换为

PyTorch张量

transforms.Normalize((0.5,),(0.5,))#以均值为0.5、标准差为0.5进行归一化])

#下载和读取数据集train_dataset=datasets.FashionMNIST(

root='./dataset',

#下载存放目录

train=True,#读取训练数据集,False则代表测试数据集

transform=train_transform,

#对训练数据额外进行数据增强

download=True#下载到本地)test_dataset=datasets.FashionMNIST(

root='./dataset',

train=False,

transform=test_transform,

download=True)3.1数据准备和预处理-加载数据

#批量加载数据集train_loader=DataLoader(train_dataset,batch_size=32,shuffle=True)test_loader=DataLoader(test_dataset,batch_size=32,shuffle=False)

#查看单条数据的形状和类型forX,yintest_loader:

print(f"ShapeofX[N,C,H,W]:{X.shape}")

print(f"Shapeofy:{y.shape}{y.dtype}")

break输出结果:ShapeofX[N,C,H,W]:torch.Size([32,1,28,28])Shapeofy:torch.Size([32])64

其中,[N,C,H,W]中的N代表batch_size大小;C代表通道数,1代表灰度图,3代表RGB图;H、W则分别代表图片的高和宽的大小。代码的功能为批量加载数据集,同时可以看到样本数据的通道为1,即灰度图。3.2定义模型和超参数

定义ResNet-18模型以下代码是一个ResNet-18预训练模型调用和调整的代码示例。importtorch.optimasoptimfromtorchvisionimportmodels

#加载和调整ResNet-18模型resnet18=models.resnet18(weights=True)

#weights为True时,将加载预训练的权重resnet18.conv1=nn.Conv2d(in_channels=1,

#修改第一个卷积层的输入通道数为1

out_channels=64,

kernel_size=7,

stride=2,

padding=3,

bias=False)resnet18.fc=nn.Linear(

in_features=resnet18.fc.in_features,#输入特征保持不变

out_features=10)#将全连接层的输出改为数据集的类别数

#实例化模型并发送到计算设备上device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")#指定GPU,如无指定CPUresnet18=resnet18.to(device)3.2定义模型和超参数

定义超参数以下代码是一个ResNet-18预训练模型调用和调整的代码示例。#定义超参数num_epochs=20learning_rate=0.001criterion=nn.CrossEntropyLoss()#采用交叉熵损失函数optimizer=optim.SGD(

#采用随机梯度下降优化算法

resnet18.parameters(),

lr=learning_rate,

momentum=0.9#momentum允许模型在梯度更新方向上保持一定的历史信息,有助于加速收敛并减小震荡)(1)BatchSize超参数设置的考虑。在代码中,batch_size决定了训练过程中完成每个epoch所需的时间和每次迭代(iteration)之间梯度的平滑程度。batchsize越大,训练速度则越快,相应内存占用也越大。因此,batchsize参数值的设置取决于内存或显存的大小。3.2定义模型和超参数

定义超参数图2-6Epoch与Loss关系图(2)Epoch超参数设置的考虑。在训练过程中,epoch是指整个数据集在模型中经过完整训练的次数。epoch的作用在于逐步提高模型的精度,直到达到一个相对稳定的水平。如图2-6所示,随着epoch的增大,Loss下降,模型精度会逐步提高,直到收敛到一个相对稳定的水平,这个时候再增加epoch会出现右侧的过拟合现象。一般情况下,我们可以根据数据集的大小和模型复杂度来初步确定epoch的大小。数据集越大、模型复杂度越高,所需的epoch数越多,需要更多的时间来学习数据集中的规律。3.2定义模型和超参数

定义超参数(3)优化器超参数设置的考虑。代码中的随机梯度下降(StochasticGradientDescent,SGD)是深度学习中最常用的优化算法之一,用于训练神经网络和调整模型参数以减小损失函数的值。SGD的基本思想是在每次迭代中随机选择一小批训练样本来计算梯度并更新模型参数,而不是使用整个训练集。SGD的优点在于,由于每次迭代只使用一小批数据,SGD通常比传统的梯度下降更快。这对于大型数据集和深层神经网络特别有用。但由于随机性,SGD的损失函数值可能波动较大,导致训练不稳定,学习率的选择和调整通常也需要较多的实验。另外,在SGD的基础上,还有许多改进的优化算法,如带动量的SGD、Adam、RMSprop等,它们在速度和稳定性方面表现更好,通常在实际应用中更受欢迎。3.3模型训练和评估此代码是模型训练的代码块,并且会把训练过程的损失值、训练后的模型结构和数据流记录到TensorBoard。fromtorch.utils.tensorboardimportSummaryWriter

writer=SummaryWriter('logs')#TensorBoard将把日志文件写入logs目录

#模型微调训练forepochinrange(num_epochs):resnet18.train()#将模型设置为训练模式

running_loss=0.0

fori,(images,labels)inenumerate(train_loader):images,labels=images.to(device),labels.to(device)#训练、标签数据送到计算设备

optimizer.zero_grad()#清零梯度

outputs=resnet18(images)

#数据传入模型进行前向传播

loss=criterion(outputs,labels)

#计算损失

loss.backward()#反向传播,计算梯度

optimizer.step()#更新参数

running_loss+=loss.item()

#计算loss总和

#每个epoch打印loss

print(f'Epoch[{epoch+1}/{num_epochs}],running_loss:{running_loss:.4f}')

#将每个epoch的训练loss记录到TensorBoard

writer.add_scalar('Loss/train',running_loss,epoch)writer.add_graph(resnet18,images)#记录训练后模型的数据流和结构到TensorBoard模型训练3.3模型训练和评估打开TensorBoard后,点击“GRAPHS”可以查看训练后的模型结构和对应的数据输入、输出的情况,如图2-7所示。模型训练图2-7TensorBoard展示图-模型结构和数据流3.3模型训练和评估模型评估:使用测试集对模型评估#在测试集上评估模型resnet18.eval()#将模型切换到评估模式,模型的权重保持不变withtorch.no_grad():#关闭梯度自动计算

correct=0#定义预测准确数

predictions=torch.tensor([],dtype=)#定义所有预测结果数组

true_labels=torch.tensor([],dtype=)#定义所有真实结果数组

forimages,labelsintest_loader:

#images,labels=images.to(device),labels.to(device)

images=images.to(device)outputs=resnet18(images).cpu()#前向传播

_,predicted=torch.max(outputs.data,1)#获取预测结果标签

predictions=torch.cat((predictions,predicted))

#合并预测结果

true_labels=torch.cat((true_labels,labels))

#合并真实结果

correct+=(predicted==labels).sum().item()#统计预测正确数

accuracy=100*correct/len(true_labels)

#计算准确率

precision=precision_score(true_labels,predictions,average='macro')

#计算精确率

recall=recall_score(true_labels,predictions,average='macro')

#计算召回率

f1=f1_score(true_labels,predictions,average='macro')

#计算F1值

print

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论