news 2026/6/10 13:55:14

线性与Softmax回归的实现与应用:Fashion-MNIST服装分类数据集与高性能数据迭代器实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线性与Softmax回归的实现与应用:Fashion-MNIST服装分类数据集与高性能数据迭代器实现

图像分类数据集

学习目标

通过本课程,学员将了解到Fashion-MNIST是一个服装分类数据集。具体来说,学员会学习到Fashion-MNIST是一个服装分类数据集由10个类别的图像组成、数据迭代器是获得更高性能的关键组件、依靠实现良好的数据迭代器、利用高性能计算来避免减慢训练过程等重要概念。

相关知识点

  • Fashion-MNIST数据集

学习内容

1 Fashion-MNIST数据集

MNIST数据集
是图像分类中广泛使用的数据集之一,但作为基准数据集过于简单。
我们将使用类似但更复杂的Fashion-MNIST数据集。

pip install d2l==1.0.3
%matplotlib inlineimporttorchimporttorchvisionfromtorch.utilsimportdatafromtorchvisionimporttransformsfromd2limporttorchasd2l d2l.use_svg_display()
1.1 读取数据集
!wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/d41fb34e144511f0b5c8fa163edcddae/FashionMNIST.zip
!unzip FashionMNIST.zip
# 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式,# 并除以255使得所有像素的数值均在0~1之间trans=transforms.ToTensor()mnist_train=torchvision.datasets.FashionMNIST(root="./data",train=True,transform=trans,download=False)mnist_test=torchvision.datasets.FashionMNIST(root="./data",train=False,transform=trans,download=False)

Fashion-MNIST由10个类别的图像组成,每个类别由训练数据集(train dataset)中的6000张图像和测试数据集(test dataset)中的1000张图像组成。因此,训练集和测试集分别包含60000和10000张图像。测试数据集不会用于训练,只用于评估模型性能。

len(mnist_train),len(mnist_test)

每个输入图像的高度和宽度均为28像素。数据集由灰度图像组成,其通道数为1。为了简洁起见,本课程将高度hhh像素、宽度www像素图像的形状记为h×wh \times wh×w或(hhh,www)。

mnist_train[0][0].shape

Fashion-MNIST中包含的10个类别,分别为t-shirt(T恤)、trouser(裤子)、pullover(套衫)、dress(连衣裙)、coat(外套)、sandal(凉鞋)、shirt(衬衫)、sneaker(运动鞋)、bag(包)和ankle boot(短靴)。
以下函数用于在数字标签索引及其文本名称之间进行转换。

defget_fashion_mnist_labels(labels):#@save"""返回Fashion-MNIST数据集的文本标签"""text_labels=['t-shirt','trouser','pullover','dress','coat','sandal','shirt','sneaker','bag','ankle boot']return[text_labels[int(i)]foriinlabels]

我们现在可以创建一个函数来可视化这些样本。

defshow_images(imgs,num_rows,num_cols,titles=None,scale=1.5):#@save"""绘制图像列表"""figsize=(num_cols*scale,num_rows*scale)_,axes=d2l.plt.subplots(num_rows,num_cols,figsize=figsize)axes=axes.flatten()fori,(ax,img)inenumerate(zip(axes,imgs)):iftorch.is_tensor(img):# 图片张量ax.imshow(img.numpy())else:# PIL图片ax.imshow(img)ax.axes.get_xaxis().set_visible(False)ax.axes.get_yaxis().set_visible(False)iftitles:ax.set_title(titles[i])returnaxes

以下是训练数据集中前几个样本的图像及其相应的标签。

X,y=next(iter(data.DataLoader(mnist_train,batch_size=18)))show_images(X.reshape(18,28,28),2,9,titles=get_fashion_mnist_labels(y));

1.2 读取小批量

为了使我们在读取训练集和测试集时更容易,我们使用内置的数据迭代器,而不是从零开始创建。
回顾一下,在每次迭代中,数据加载器每次都会读取一小批量数据,大小为batch_size
通过内置数据迭代器,我们可以随机打乱了所有样本,从而无偏见地读取小批量。

batch_size=256defget_dataloader_workers():#@save"""使用4个进程来读取数据"""return4train_iter=data.DataLoader(mnist_train,batch_size,shuffle=True,num_workers=get_dataloader_workers())

我们看一下读取训练数据所需的时间。

timer=d2l.Timer()forX,yintrain_iter:continuef'{timer.stop():.2f}sec'

out:

'3.24 sec'
1.3 整合所有组件

现在我们定义load_data_fashion_mnist函数,用于获取和读取Fashion-MNIST数据集。
这个函数返回训练集和验证集的数据迭代器。
此外,这个函数还接受一个可选参数resize,用来将图像大小调整为另一种形状。

defload_data_fashion_mnist(batch_size,resize=None):#@save"""下载Fashion-MNIST数据集,然后将其加载到内存中"""trans=[transforms.ToTensor()]ifresize:trans.insert(0,transforms.Resize(resize))trans=transforms.Compose(trans)mnist_train=torchvision.datasets.FashionMNIST(root="./data",train=True,transform=trans,download=False)mnist_test=torchvision.datasets.FashionMNIST(root="./data",train=False,transform=trans,download=False)return(data.DataLoader(mnist_train,batch_size,shuffle=True,num_workers=get_dataloader_workers()),data.DataLoader(mnist_test,batch_size,shuffle=False,num_workers=get_dataloader_workers()))

下面,我们通过指定resize参数来测试load_data_fashion_mnist函数的图像大小调整功能。

train_iter,test_iter=load_data_fashion_mnist(32,resize=64)forX,yintrain_iter:print(X.shape,X.dtype,y.shape,y.dtype)break

Out:

torch.Size([32, 1, 64, 64]) torch.float32 torch.Size([32]) torch.int64
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 10:03:10

STM32开发者必看:Keil安装避坑指南

STM32开发者必看:Keil安装避坑指南 在嵌入式开发的世界里,如果你正准备点亮第一颗LED、调试第一个GPIO,或是跑通一段ADC采样代码——那么恭喜你,已经迈出了成为STM32工程师的第一步。但在这之前,有一个绕不开的“入门仪…

作者头像 李华
网站建设 2026/6/5 19:48:42

STM32中SMBus通信配置:手把手教程(从零实现)

STM32中SMBus通信实战:从协议到代码的完整实现你有没有遇到过这样的场景?系统里接了几个温度传感器和电源监控芯片,IC总线上时不时就“卡死”——主控发不出数据、读不到回应,最后只能靠复位解决。调试时用逻辑分析仪一看&#xf…

作者头像 李华
网站建设 2026/6/10 16:06:11

开源社区力荐:GPT-SoVITS成为GitHub热门语音项目的原因

GPT-SoVITS:为何这款开源语音克隆项目在GitHub上迅速走红? 在内容创作、虚拟主播和无障碍交互日益普及的今天,用户不再满足于机械感十足的合成语音。他们想要的是——用自己或特定人物的声音,自然流畅地说出任何想说的话。而这一需…

作者头像 李华
网站建设 2026/6/10 16:04:13

跨语言语音合成实现路径:GPT-SoVITS支持中英混读场景

跨语言语音合成实现路径:GPT-SoVITS支持中英混读场景 在智能语音助手、有声内容创作和虚拟角色交互日益普及的今天,用户对语音合成系统的要求早已超越“能说话”这一基本功能。人们期待的是自然、个性、多语种无缝切换的声音体验——尤其是在中文为主但频…

作者头像 李华
网站建设 2026/6/10 15:57:19

10、天气信息模块开发全解析

天气信息模块开发全解析 1. 天气信息函数的编写 在开发过程中,若一切顺利, $weather 对象会被返回以供使用。此时,我们需要编写调用此函数的代码。在 weather_info.inc 文件里,还需编写一个名为 weather_info_temp() 的函数,它将返回带有度数符号和测量单位的温度。…

作者头像 李华