第五章——Pytorch中常用的工具

本文介绍了Pytorch中数据处理的常见操作,包括使用Dataset、ImageFolder、DataLoader和不同的sampler。DataLoader用于批量加载数据,ImageFolder是一个常用的数据集,而sampler提供了多样化的数据采样策略。文中详细讲解了如何使用transforms进行数据预处理,如尺寸调整、裁剪、归一化等,并讨论了在样本不平衡情况下的重采样方法。
摘要由CSDN通过智能技术生成

1. 数据处理

数据加载

在Pytorch 中,数据加载可以通过自己定义的数据集对象来实现。数据集对象被抽象为Dataset类,实现自己定义的数据集需要继承Dataset,并实现两个Python魔法方法。

  • __getitem__: 返回一条数据或一个样本。obj[index]等价于obj.__getitem__(index).
  • __len__: 返回样本的数量。len(obj)等价于obj.__len__().
import torch as t
from torch.utils import data
import os
from PIL import Image
import numpy as np

class DogCat(data.Dataset):
    def __init__(self,root):
        imgs=os.listdir(root)
        #所有图片的绝对路径
        #这里不实际加载图片,只是指定路径,当调用__getitem__时才会真正读图片
        self.imgs=[os.path.join(root, img) for img in imgs]

    def __getitem__(self, index):
        img_path=self.imgs[index]
        #dog->1, cat->0
        label=1 if 'dog' in img_path.split("/")[-1] else 0
        pil_img=Image.open(img_path)
        array=np.asarray(pil_img)
        data=t.from_numpy(array)
        return data,label

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

dataset=DogCat('N:/百度网盘/kaggle/DogCat')
img,label=dataset[0]#相当于调用dataset.__getitem__(0)
for img,label in dataset:
    print(img.size(),img.float().mean(),label)

结果:

torch.Size([280, 300, 3]) tensor(71.6653) 0
torch.Size([396, 312, 3]) tensor(131.8400) 0
torch.Size([414, 500, 3]) tensor(156.6921) 0
torch.Size([375, 499, 3]) tensor(96.8243) 0
torch.Size([445, 431, 3]) tensor(103.8582) 1
torch.Size([373, 302, 3]) tensor(160.0512) 1
torch.Size([240, 288, 3]) tensor(95.1983) 1
torch.Size([499, 375, 3]) tensor(90.5196) 1

问题:结果大小不一,这对于batch训练的神经网络来说很不友好。
返回的样本数值交大,未归一化至【-1,1】

针对上述问题,pytorch提供了torchvision。它是一个视觉工具包,提供了很多视觉图像处理的工具。
其中transforms模块提供了对PIL Image对象和Tensor对象的常用操作。

对PIL Image的常见操作如下:

  • Scale/Resize: 调整尺寸,长宽比保持不变; #Resize
  • CenterCrop、RandomCrop、RandomSizedCrop:裁剪图片;
  • Pad: 填充;
  • ToTensor: 将PIL Image对象转换成Tensor,会自动将【0,255】归一化至【0,1】。

对Tensor的常见操作如下:

  • Normalize: 标准化,即减均值,除以标准差;
  • ToPILImage:将Tensor转为PIL Image.

    如果要对图片进行多个操作,可通过Compose将这些操作拼接起来,类似于nn.Sequential.
    这些操作定义之后是以对象的形式存在,真正使用时需要调用它的__call__方法,类似于nn.Mudule.
    例如:要将图片调整为224*224,首先应构建操作trans=Scale((224,224)),然后调用trans(img).

import os
from PIL import Image
import numpy as n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值