3.5.0 头文件
import torch
import torchvision
from torch.utils import data
from torchvision import transforms
from d2l import torch as d2l
from matplotlib import pyplot as plt
d2l.use_svg_display()
3.5.1 下载FashionMNIST训练集和测试集
# 定义一个类型转换器,将图像转换成tensor类型,并且将像素值归一化为[0,1]
trans = transforms.ToTensor()
# 下载FashionMNIST训练集,并保存在data目录下,并且把图像格式转换为tensor,格式为(特征集合,数字标签集合)
mnist_train = torchvision.datasets.FashionMNIST(root="../data", train=True, transform=trans, download=True)
# 下载FashionMNIST测试集,并保存在data目录下,并且把图像格式转换为tensor,格式为(特征集合,数字标签集合)
mnist_test = torchvision.datasets.FashionMNIST(root="../data", train=False, transform=trans, download=True)
print(len(mnist_train))
print(len(mnist_test))
# 输出:
# 60000
# 10000
print(mnist_train[0][0].shape) #单个样本的格式为(图像数据,数字标签),图像数值为[0,1]
# 输出:
# torch.Size([1, 28, 28])
2.5.2 可视化数据集中的一些样本和文本标签
# 定义一个将数字标签转换为文字标签的函数
# labels:数字标签集合
def get_fashion_mnist_labels(labels):
# 每个数字标签对应的文本标签
text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat', 'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
return [text_labels[int(i)] for i in labels] # 返回文本标签集合
# 定义一个样本以及样本标签可视化函数
# imgs:一个批量样本的数据特征,格式为(批量大小,行数,列数)
# num_rows:要在OutPut.png中显示的行数
# num_cols:要在OutPut.png中显示的列数
# titles:每个样本对应的文本标签列表
def show_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()
for i, (ax, img) in enumerate(zip(axes, imgs)):
if torch.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)
if titles:
ax.set_title(titles[i])
return axes
# 迭代获得一个批量的训练集样本,把特征集合存放到X中,把对应的数字标签放到y中
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));
plt.savefig('OutPut.png')
2.5.3 遍历整个训练集
# 定义批量大小
batch_size = 256
# 定义一个函数,表示使用4个进程来对数据集按批量大小进行封装
def get_dataloader_workers():
"""使用4个进程来读取数据"""
return 4
# 将训练集(形式为(特征集合,标签集合))打乱,然后按照批量大小对训练集进行切割并封装
# mnist_train:整个训练集,形式为(特征集合,标签集合)
# batch_size:批量大小
# shuffle:将训练集打乱
# num_workers:完成这项任务用到的进程数
train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True,num_workers=get_dataloader_workers())
# 计算遍历一轮训练集所用的时间
timer = d2l.Timer()
for X, y in train_iter:
continue
print(f'{timer.stop():.2f} sec')
# 输出:
# 4.16 sec
3.5.4 下载fashion_mnist,并对数据集进行打乱和按批量大小进行切割的操作,得到可迭代的训练集和测试集(训练集和测试集的形式都为(特征数据集合,数字标签集合))
def load_data_fashion_mnist(batch_size, resize=None):
"""下载Fashion-MNIST数据集,然后将其加载到内存中"""
# 定义一个类型转换器,将图像转换成tensor类型,并且将像素值归一化为[0,1]
trans = [transforms.ToTensor()]
if resize:
# 将图像宽度缩放为resize,同时高度也等比例缩放
trans.insert(0, transforms.Resize(resize))
trans = transforms.Compose(trans)
# 下载FashionMNIST训练集,并保存在data目录下,并且把图像格式转换为tensor,格式为(特征集合,数字标签集合)
mnist_train = torchvision.datasets.FashionMNIST(root="../data", train=True, transform=trans, download=True)
# 下载FashionMNIST测试集,并保存在data目录下,并且把图像格式转换为tensor,格式为(特征集合,数字标签集合)
mnist_test = torchvision.datasets.FashionMNIST(root="../data", train=False, transform=trans, download=True)
# 分别将训练集和测试集(两者的形式都为(特征集合,标签集合))打乱,然后分别按照批量大小对训练集和测试集进行切割并封装
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()))
本小节完整代码如下
import torch
import torchvision
from torch.utils import data
from torchvision import transforms
from d2l import torch as d2l
from matplotlib import pyplot as plt
d2l.use_svg_display()
# ------------------------------下载FashionMNIST训练集和测试集------------------------------------
# 定义一个类型转换器,将图像转换成tensor类型,并且将像素值归一化为[0,1]
trans = transforms.ToTensor()
# 下载FashionMNIST训练集,并保存在data目录下,并且把图像格式转换为tensor,格式为(特征集合,数字标签集合)
mnist_train = torchvision.datasets.FashionMNIST(root="../data", train=True, transform=trans, download=True)
# 下载FashionMNIST测试集,并保存在data目录下,并且把图像格式转换为tensor,格式为(特征集合,数字标签集合)
mnist_test = torchvision.datasets.FashionMNIST(root="../data", train=False, transform=trans, download=True)
print(len(mnist_train))
print(len(mnist_test))
# 输出:
# 60000
# 10000
print(mnist_train[0][0].shape) #单个样本的格式为(图像数据,数字标签),图像数值为[0,1]
# 输出:
# torch.Size([1, 28, 28])
# ------------------------------可视化其中的一些样本和文本标签------------------------------------
# 定义一个将数字标签转换为文字标签的函数
# labels:数字标签集合
def get_fashion_mnist_labels(labels):
# 每个数字标签对应的文本标签
text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',
'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
return [text_labels[int(i)] for i in labels] # 返回文本标签集合
# 定义一个样本以及样本标签可视化函数
# imgs:一个批量样本的数据特征,格式为(批量大小,行数,列数)
# num_rows:要在OutPut.png中显示的行数
# num_cols:要在OutPut.png中显示的列数
# titles:每个样本对应的文本标签列表
def show_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()
for i, (ax, img) in enumerate(zip(axes, imgs)):
if torch.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)
if titles:
ax.set_title(titles[i])
return axes
# 迭代获得一个批量的训练集样本,把特征集合存放到X中,把对应的数字标签放到y中
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));
plt.savefig('OutPut.png')
# ------------------------------遍历整个训练集------------------------------------
# 定义批量大小
batch_size = 256
# 定义一个函数,表示使用4个进程来对数据集按批量大小进行封装
def get_dataloader_workers():
"""使用4个进程来读取数据"""
return 4
# 将训练集(形式为(特征集合,标签集合))打乱,然后按照批量大小对训练集进行切割并封装
# mnist_train:整个训练集,形式为(特征集合,标签集合)
# batch_size:批量大小
# shuffle:将训练集打乱
# num_workers:完成这项任务用到的进程数
train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True,num_workers=get_dataloader_workers())
# 计算遍历一轮训练集所用的时间
timer = d2l.Timer()
for X, y in train_iter:
continue
print(f'{timer.stop():.2f} sec')
# 输出:
# 4.16 sec
# ------------------------------下载fashion_mnist,并对数据集进行打乱和按批量大小进行切割的操作,得到可迭代的训练集和测试集(训练集和测试集的形式都为(特征数据集合,数字标签集合))------------------------------------
def load_data_fashion_mnist(batch_size, resize=None):
"""下载Fashion-MNIST数据集,然后将其加载到内存中"""
# 定义一个类型转换器,将图像转换成tensor类型,并且将像素值归一化为[0,1]
trans = [transforms.ToTensor()]
if resize:
trans.insert(0, transforms.Resize(resize))
trans = transforms.Compose(trans)
# 下载FashionMNIST训练集,并保存在data目录下,并且把图像格式转换为tensor,格式为(特征集合,数字标签集合)
mnist_train = torchvision.datasets.FashionMNIST(root="../data", train=True, transform=trans, download=True)
# 下载FashionMNIST测试集,并保存在data目录下,并且把图像格式转换为tensor,格式为(特征集合,数字标签集合)
mnist_test = torchvision.datasets.FashionMNIST(root="../data", train=False, transform=trans, download=True)
# 分别将训练集和测试集(两者的形式都为(特征集合,标签集合))打乱,然后分别按照批量大小对训练集和测试集进行切割并封装
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()))