Dataset类实战 小tips首先,通过官方文档了解一下:
DataSet类是一个抽象类,所有的数据集都必须继承Dataset类,然后重写__getitem__方法(这个方法主要是获得每个数据对应的label),也可以选择重写__len__方法(返回值是数据集的长度)
os类的几个常用方法在调试的时候,推荐大家多使用console,比如我打开了一张图片,在右边就会显示这个图片的所有属性,非常方便,当不知道一个对象有什么属性的时候,也可以这样看看
os.listdir(dir) 将指定的dir目录下的文件变成一个列表
example
dir_path = "D:mypytorchlearn_pytorch\hymenoptera_data\train\ants" img_path_list = os.listdir(dir_path)
os.path.join(root_idr,label.dir)将给定的两个地址拼接成一个
example
import os root_idr = "D:mypytorchlearn_pytorch\hymenoptera_data\train" label_dir = "ants" path = os.path.join(root_idr,label_dir)Dataset实战
我们重写了__getitem__方法,如果想要通过idx来获取图片,那就要将数据集变成一个列表
因为在一个目录下往往不止一个数据集,所以初始化的时候,我们将根目录和数据集目录分别命名再拼接,这样我们写的数据集方法就能通用
from torch.utils.data import Dataset
from PIL import Image
import os
class MyData(Dataset):
def __init__(self, root_dir, label_dir):
self.root_dir = root_dir
self.label_dir = label_dir
self.path = os.path.join(self.root_dir, self.label_dir)
self.img_path = os.listdir(self.path)
def __getitem__(self, idx):
img_name = self.img_path[idx]
img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)
img = Image.open(img_item_path)
label = self.label_dir
return img, label
def __len__(self):
return len(self.img_path)
在控制台调试,可以看到,我们创建了两个数据集,ants_dataset和bees_dataset,在右边可以看到数据集的属性,也就是MyData类定义的属性
因为getitem方法返回两个参数,所以用下标访问数据集里的某个数据时有两个参数
合并两个数据集train_dataset = ants_dataset + bees_dataset
123就是蚂蚁数据集的最后一张图片,124就是蜜蜂数据集的第一张图片,所以合并就是将后面的数据集的编号(原本从0开始),从前面数据集的长度开始



