数据集和数据加载器 1 torchvision.datasets 官方数据集加载 我们使用以下参数加载FashionMNIST 数据集:
root 是存储训练/测试数据的路径,
train 指定训练或测试数据集,
download=True如果数据不可用,则从 Internet 下载数据root。
transform并target_transform指定特征和标签转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import torchfrom torch.utils.data import Datasetfrom torchvision import datasetsfrom torchvision.transforms import ToTensorimport matplotlib.pyplot as plttraining_data = datasets.FashionMNIST( root="data" , train=True , download=True , transform=ToTensor() ) test_data = datasets.FashionMNIST( root="data" , train=False , download=True , transform=ToTensor() )
对加载的数据集进行可视化显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 labels_map = { 0 : "T-Shirt" , 1 : "Trouser" , 2 : "Pullover" , 3 : "Dress" , 4 : "Coat" , 5 : "Sandal" , 6 : "Shirt" , 7 : "Sneaker" , 8 : "Bag" , 9 : "Ankle Boot" , } figure = plt.figure(figsize=(8 , 8 )) cols, rows = 3 , 3 for i in range (1 , cols * rows + 1 ): sample_idx = torch.randint(len (training_data), size=(1 ,)).item() img, label = training_data[sample_idx] figure.add_subplot(rows, cols, i) plt.title(labels_map[label]) plt.axis("off" ) plt.imshow(img.squeeze(), cmap="gray" ) plt.show()
2 自定义dataset加载数据集
自定义 Dataset 类必须实现三个函数:init 、len__和__getitem 。看看这个实现;FashionMNIST 图像存储在一个目录中img_dir,它们的标签单独存储在一个 CSV 文件中annotations_file。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import osimport pandas as pdfrom torchvision.io import read_imageclass CustomImageDataset (Dataset ): def __init__ (self, annotations_file, img_dir, transform=None , target_transform=None ): self .img_labels = pd.read_csv(annotations_file) self .img_dir = img_dir self .transform = transform self .target_transform = target_transform def __len__ (self ): return len (self .img_labels) def __getitem__ (self, idx ): img_path = os.path.join(self .img_dir, self .img_labels.iloc[idx, 0 ]) image = read_image(img_path) label = self .img_labels.iloc[idx, 1 ] if self .transform: image = self .transform(image) if self .target_transform: label = self .target_transform(label) return image, label
init 函数在实例化 Dataset 对象时运行一次。我们初始化包含图像、注释文件和两个转换的目录
len 函数返回我们数据集中的样本数。
getitem 函数从给定索引处的数据集中加载并返回一个样本idx。基于索引,它识别图像在磁盘上的位置,使用 将其转换为张量read_image,从 中的 csv 数据中检索相应的标签self.img_labels,调用它们的变换函数(如果适用),并返回张量图像和相应的标签一个元组。
3 使用DataLoader进行训练
我们已将该数据集加载到 中,Dataloader并且可以根据需要遍历数据集。下面的每次迭代都会返回一批train_features和train_labels(batch_size=64分别包含特征和标签)。因为我们指定了shuffle=True,在我们遍历所有批次后,数据会被打乱
1 2 3 4 5 6 7 8 9 train_features, train_labels = next (iter (train_dataloader)) print (f"Feature batch shape: {train_features.size()} " )print (f"Labels batch shape: {train_labels.size()} " )img = train_features[0 ].squeeze() label = train_labels[0 ] plt.imshow(img, cmap="gray" ) plt.show() print (f"Label: {label} " )