pytorch下处理数据以及torchvision.datasets.ImageFolder的使用

本文详细介绍了在PyTorch中如何处理非图像数据和图像数据。对于非图像数据,转换包括将数据转化为torch.tensor并确保标签为torch.int64。图像数据则可通过torchvision.datasets.ImageFolder导入,并利用DataLoader进行批量处理。此外,还展示了自定义数据加载类的方式。所有数据在PyTorch中必须为tensor类型。
摘要由CSDN通过智能技术生成
1.针对一般数据(不是图像类型)

①一行代表一个数据,可以是普通列表或者是np.array的形式,下面例子中x_train和x_test就是这样,分别代表着训练集和测试集,按照下边这个转换就可以啦
注意 要是分类问题,标签必须是torch.int64类型

也可以将标签和样本放到一起,每一行类似这样的([2,3,4],0),标签为0,[2,3,4]为样本特征;然后在迭代时,一行就直接可以取出样本特征和它的标签

train_x = torch.tensor(x_train,dtype=torch.float32)
train_y = torch.tensor(y_train,dtype=torch.int64)
test_x = torch.tensor(x_test,dtype=torch.float32)
test_y = torch.tensor(y_test,dtype=torch.int64)
2.针对图像类型数据

①先导入数据

img_data = torchvision.datasets.ImageFolder(file_name,
                                            transform=transforms.Compose([
                                                transforms.Scale(512),
                                                transforms.CenterCrop(512),
                                                transforms.ToTensor()])
                                            )
dataloader = DataLoader(img_data, batch_size=50)

torchvision.datasets.ImageFolder这个函数(非常适合用文件夹来分类的数据集),是根据文件夹进行导入数据,它给file_name下的每个文件夹默认分一个类(类别标签从0开始,有k个文件夹就有k个类,类别的最大号就是k-1),一个文件夹代表一个类,然后根据transform的条件将数据进行转换,导入的数据就类似这样的([[2,3,4],[1,2,3]],1),也是一行代表一个样本,0的位置是样本特征,1的位置是样本标签;
所以img_data的样本的个数就是file_name下所有的文件夹里的文件个数之和。

DataLoader函数进行的就是,将整个数据集划分批数,batch_size参数代表一批有多少个样本,也可用shuffle参数进行随机打乱,当数据集参数量比较大时,模型训练时使用小批量样本或随机样本(一批就1个样本),然后在训练样本时,就直接可以把dataloader放入循环,一批一批的取数据进行训练

②另一种方法
自己改写一个读取数据的类

class MyData(Dataset):
    def __init__(self,imag_path,labels,transform):
        self.imag_path = imag_path
        self.imag_path_list = os.listdir(imag_path)
        self.labels = labels
        self.transform = transform

    def __getitem__(self, item):
        imag_name = self.imag_path_list[item]
        imag_item_path = os.path.join(self.imag_path,imag_name)
        img = Image.open(imag_item_path)
        img = self.transform(img)  #将图片类型进行转换
        label = self.labels[item]-1
        return img,label   # 返回的第item项的图片以及对应的标签

    def __len__(self):
        return len(self.imag_path_list)

注意:
pytorch下读取图片都是先用Image模块读取,然后直接用transform将其变为tensor类型,如果是numpy类型会比较麻烦(本人在处理时遇到了,能烦死,一直报错,最后屈服于它;可能是我弄的有问题,大家如果可以实现,请教一下我怎么整)

#all_data产生的是(data,label)的元组,
all_data = MyData(file_name,all_labels,transform=transform)
dataloader_try = DataLoader(all_data, batch_size=50,shuffle=True)  #是一个迭代器,共162个批次

all_data就和上边那个img_data中数据展现形式一致,一行一个样本以及他的标签,下边那个函数就和上边一样啦!

注意:
pytorch下的数据可都得是tensor类型哦!(初学者极易入坑)

不懂的,咱们一起评论区交流哦

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值