先把所有代码附上
from torch.utils.data import Dataset
import os
from PIL import Image
class MyData(Dataset):
def __init__(self,root_dir,lable_dir):
self.root_dir=root_dir
self.lable_dir=lable_dir
self.path=os.path.join(self.root_dir,self.lable_dir)
self.image_path=os.listdir(self.path)
def __getitem__(self,idx):
img_name=self.image_path[idx]
img_item_path=os.path.join(self.root_dir,self.lable_dir,img_name)
img=Image.open(img_item_path)
lable=self.lable_dir
return img,lable
def __len__(self):
return len(self.image_path)
root_dir="dataset/hymenoptera_data/train"
ants_lable_dir="ants"
ants_dataset=MyData(root_dir,ants_lable_dir)
img,lable=ants_dataset[0]
img.show()
这是运行结果
下面,我一段一段的说出自己对这些代码的理解
from torch.utils.data import Dataset
import os
from PIL import Image
这三句导入库,不用多说
class MyData(Dataset):
def __init__(self,root_dir,lable_dir):
self.root_dir=root_dir
self.lable_dir=lable_dir
self.path=os.path.join(self.root_dir,self.lable_dir)
self.image_path=os.listdir(self.path)
def __getitem__(self,idx):
img_name=self.image_path[idx]
img_item_path=os.path.join(self.root_dir,self.lable_dir,img_name)
img=Image.open(img_item_path)
lable=self.lable_dir
return img,lable
def __len__(self):
return len(self.image_path)
这里我想先说一下这个类里面的self,原来自学过一段时间的爬虫,没怎么用到class这个函数,自学python基础的时候学过,当时就没怎么搞明白后来,自己又要学深度学习,就有去看了一下书,后面我自己的理解就是,def的函数他的参量就是只能给自己一个函数用,别的函数不行,但是一个类有很多函数,怎么样让所有的函数都有一个共同的参量,就是通过self,这个是我自己的理解
然后这个os库里面的path里面有个join方法,这个是让两个路径和在一起,小土堆之所以用这个函数,就是避免系统复制的路径出现问题,因为Windows复制过来要加一个转义符
os里面的listdir就是将所有的图片放到一个列表里面,可以通过列表的索引操作找到图片
Image,里面的open函数,打开一张图片
root_dir="dataset/hymenoptera_data/train"
ants_lable_dir="ants"
ants_dataset=MyData(root_dir,ants_lable_dir)
img,lable=ants_dataset[0]
img.show()
这里实例化一个类,输入路径,这里的都是相对路径,这里的
img,lable=ants_dataset[0]
这句我不是很理解,因为他这里有两个return,返回了三个值,怎么就可以这样直接索引到第一张图,欢迎大家指正。
本人在寒假期间会持续学习小土堆的视频,持续更新学习笔记,一方面是自己总结巩固学习成果,另一方面,希望自己能开张圣听,获得一些别人的想法,如果有什么理解错误的地方,欢迎大家在评论区或者私信给我,谢谢大家斧正
今天是24年1月15号,我经过两天python类的学习得到了我的这个问题的解答,dataset类继承是需要重写这个方法的,这里的__getitem__是魔术方法会自动调用,不用我们自己调用,为什么这里img,lable=ants_dataset[0]会返回两个值,而没有返回__len__()方法的值,是因为一般的我们不写这个__getitem__这个方法,在实例化对象的时候,正如上面代码的实例化对象,实例化成了ants_dataset,一个实例化的对象你怎么索引它的值,只有写了这个__getitem__的方法,ants_dataset[0],就等于ants_dataset.__getitem__,差不多是调用了这个方法,才能够达到索引的目的