pytroch之数据读取

图片数据一般有两种情况:
1. 所有图片放在一个文件夹内,另外有一个txt文件显示标签。
2. 不同类别的图片放在不同的文件夹内,文件夹就是图片的类别。

今天写猫狗大战代码时就遇到了这样的错误,我一直把这两个概念搞混淆。总是把所有不同类别的图片放在同一个没有txt文件显示标签的文件夹中。编译器一直给我报错找不到文件,但是我按着目录找又总是能找到文件!!!!纠结

针对这两种不同的情况,数据集的准备不相同,第一种情况可以自定义一个Dataset,第二种情况直接调用torchvision.datasets.ImageFolder来处理。

所有图片放在一个文件夹内,另外有一个txt文件显示标签。

torch.utils.data.Dataset 是代表这一数据的抽象类,你可以自己定义你的数据类型继承和重写这个抽象类,非常简单,只需要定义_ len __ getitem _这两个函数即可:

class myDataset(Dataset):
    def __init__(self,csv_file,txt_file,root_dir,other_file):
        self.csv_data = pd.read_csv(csv_file)
        with open(txt_file,'r') as f:
            data_list = f.readlines()
        self.txt_data = data_list
        self.root_dir = root_dir
    def __len__(self):
        return len(self.csv_data)
    def __getitem__(self,idx):
        data = (self.csv_data[idx],self.txt_data[idx])
        return data

通过以上方式,可以定义我们需要的数据类。

不同类别的图片放在不同的文件夹内,文件夹就是图片的类别。

在torchvision这个包中还有一个更高级的关于计算机视觉的数据读取类:ImageFolder,主要功能是处理图片,但是要求不同类别的图片放在不同的文件夹内,文件夹就是图片的类别。如官方给出的格式(不一定是.png,只要是图片类型都可以):

root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png

root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png

之后按如下方式调用这个类:

dset.ImageFolder(root="root folder path", [transform, target_transform])

最后,通过torch.utils.data.DataLoaderl来定义一个新的迭代器,来实现取batch,shuffle或者是多线程读数据。

class torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=<function default_collate>, pin_memory=False, drop_last=False)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值