- 导入所需库
- 使用svg展示图片
- 将FashionMNIST数据下载并读取到内存之中
- 编写图像可视化程序
- 查看读取时间
- 整合所有组件
%matplotlib inline import torch import torchvision from torch.utils import data from torchvision import transforms from d2l import torch as d2l使用svg展示图片
# 使用svg展示图片 d2l.use_svg_display()将FashionMNIST数据下载并读取到内存之中
# 将FashionMNIST数据下载并读取到内存之中
trans = transforms.ToTensor() # 将图片转换为tensor
mnist_train = torchvision.datasets.FashionMNIST(
root="../data", # 下载目录
train=True, #下载的是训练数据集
transform=trans, #下载并转换
download=True # 从网络下载
)
mnist_test = torchvision.datasets.FashionMNIST(
root="../data",
train=False, #测试数据集
transform=trans,
download=True
)
len(mnist_train), len(mnist_test)
编写图像可视化程序
def get_fashion_mnist_labels(labels):
# 返回Fashion-MNIST数据集的文本标签
# t-shirt(T恤),trouser(牛仔裤),pullover(套衫),dress(裙子),coat(外套)
# sandal(凉鞋),shirt(衬衫),sneaker(运动鞋),bag(包),ankle boot(短靴)
text_labels = ['t-shirt','trouser','pullover','dress','coat',
'sandal','shirt','sneaker','bag','ankle boot']
return [text_labels[int(i)] for i in labels]
def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5): # num_rows为画布行数 num_cols为画布列数 scale为图像放大倍数
# 绘制图像列表
figsize = (num_cols * scale, num_rows * scale) # (3, 13.5)
_, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize) # 设置画布 figsize设置为放大后的倍数
axes = axes.flatten() # 可以直接用axes[i]代替axes[i, j],长度为18的ndarray,访问某个画布
# enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中
# list(enumerate(['Spring', 'Summer', 'Fall', 'Winter']))=[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
for i, (ax, img) in enumerate(zip(axes, imgs)): # 遍历18个画布 ax为画布 img为图片
if torch.is_tensor(img):
# 图片张量
ax.imshow(img.numpy())
else:
# PIL图片
ax.imshow(img)
ax.axes.get_xaxis().set_visible(False) # 取消显示x轴
ax.axes.get_yaxis().set_visible(False) # 取消显示y轴
if titles:
ax.set_title(titles[i])
return axes
# 将data_iter使用iter()函数转化为迭代对象,使用next()函数输出第一次迭代结果 # X.shape=torch.Size([18, 1, 28, 28]) y.shape=torch.Size([18]) 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))
结果如下:
# 读取一个批量 大小为batch_size
def get_dataloader_workers():
# 使用4个进程来读取数据
return 4
batch_size = 256
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
f'{timer.stop():.2f}sec'
# 有时训练速度要比读取速度要快,这是不理想的
整合所有组件
# 整合所有组件
def load_data_fashion_mnist(batch_size, resize=None):
trans = [transforms.ToTensor()]
if resize:
trans.insert(0, transforms.Resize(resize))
trans = transforms.Compose(trans)
mnist_train = torchvision.datasets.FashionMNIST(
root="../data", # 下载目录
train=True, #下载的是训练数据集
transform=trans, #下载并转换
download=True # 从网络下载
)
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()))



