pytorch 数据处理:定义自己的数据集合实例
数据处理
版本1
#数据处理 importos importtorch fromtorch.utilsimportdata fromPILimportImage importnumpyasnp #定义自己的数据集合 classDogCat(data.Dataset): def__init__(self,root): #所有图片的绝对路径 imgs=os.listdir(root) self.imgs=[os.path.join(root,k)forkinimgs] def__getitem__(self,index): img_path=self.imgs[index] #dog->1cat->0 label=1if'dog'inimg_path.split('/')[-1]else0 pil_img=Image.open(img_path) array=np.asarray(pil_img) data=torch.from_numpy(array) returndata,label def__len__(self): returnlen(self.imgs) dataSet=DogCat('./data/dogcat') print(dataSet[0])
输出:
( (0,.,.)= 215203191 206194182 211199187 ⋮ 200191186 201192187 201192187 (1,.,.)= 215203191 208196184 213201189 ⋮ 198189184 200191186 201192187 (2,.,.)= 215201188 209195182 214200187 ⋮ 200191186 202193188 204195190 … (399,.,.)= 729032 8810648 38560 ⋮ 158161106 878536 1059852 [torch.ByteTensorofsize400x300x3] ,1)
上面的数据处理有下面的问题:
1.返回的样本的形状大小不一致,每一张图片的大小不一样。这对于需要batch训练的神经网络来说很不友好。
2.返回的数据样本数值很大,没有归一化【-1,1】
对于上面的问题,pytorchtorchvision是一个视觉化的工具包,提供了很多的图像处理的工具,其中transforms模块提供了对PILimage对象和Tensor对象的常用操作。
对PILImage常见的操作如下;
Resize调整图片的尺寸,长宽比保持不变
CentorCrop,RandomCrop,RandomSizeCrop裁剪图片
Pad填充
ToTensor将PILImage转换为Tensor,会自动将[0,255]归一化至[0,1]
对Tensor的操作如下:
Normalize标准化,即减均值,除以标准差
ToPILImage将Tensor转换为PILImage对象
版本2
#数据处理 importos importtorch fromtorch.utilsimportdata fromPILimportImage importnumpyasnp fromtorchvisionimporttransforms transform=transforms.Compose([ transforms.Resize(224),#缩放图片,保持长宽比不变,最短边的长为224像素, transforms.CenterCrop(224),#从中间切出224*224的图片 transforms.ToTensor(),#将图片转换为Tensor,归一化至[0,1] transforms.Normalize(mean=[.5,.5,.5],std=[.5,.5,.5])#标准化至[-1,1] ]) #定义自己的数据集合 classDogCat(data.Dataset): def__init__(self,root): #所有图片的绝对路径 imgs=os.listdir(root) self.imgs=[os.path.join(root,k)forkinimgs] self.transforms=transform def__getitem__(self,index): img_path=self.imgs[index] #dog->1cat->0 label=1if'dog'inimg_path.split('/')[-1]else0 pil_img=Image.open(img_path) ifself.transforms: data=self.transforms(pil_img) else: pil_img=np.asarray(pil_img) data=torch.from_numpy(pil_img) returndata,label def__len__(self): returnlen(self.imgs) dataSet=DogCat('./data/dogcat') print(dataSet[0])
输出:
( (0,.,.)= -0.1765-0.2627-0.1686…-0.0824-0.2000-0.2627 -0.2392-0.3098-0.3176…-0.2863-0.2078-0.1765 -0.3176-0.2392-0.2784…-0.2941-0.1137-0.0118 …⋱… -0.7569-0.5922-0.1529…-0.8510-0.8196-0.8353 -0.8353-0.7255-0.3255…-0.8275-0.8196-0.8588 -0.9373-0.7647-0.4510…-0.8196-0.8353-0.8824 (1,.,.)= -0.0431-0.1373-0.0431…0.0118-0.0980-0.1529 -0.0980-0.1686-0.1765…-0.1608-0.0745-0.0431 -0.1686-0.0902-0.1373…-0.14510.04310.1529 …⋱… -0.5529-0.38040.0667…-0.7961-0.7725-0.7961 -0.6314-0.5137-0.1137…-0.7804-0.7882-0.8275 -0.7490-0.5608-0.2392…-0.7725-0.8039-0.8588 … [torch.FloatTensorofsize3x224x224] ,1)
项目的github地址:https://github.com/WebLearning17/CommonTool
以上这篇pytorch数据处理:定义自己的数据集合实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。