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()))

 

posted on 2022-11-03 17:34  yc-limitless  阅读(88)  评论(0编辑  收藏  举报