pytorch 数据处理:定义自己的数据集合实例
2020-06-25 08:12:16 来源:易采站长站 作者:易采站长站整理
数据处理
版本1
#数据处理
import os
import torch
from torch.utils import data
from PIL import Image
import numpy as np#定义自己的数据集合
class DogCat(data.Dataset):
def __init__(self,root):
#所有图片的绝对路径
imgs=os.listdir(root)
self.imgs=[os.path.join(root,k) for k 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=torch.from_numpy(array)
return data,label
def __len__(self):
return len(self.imgs)
dataSet=DogCat('./data/dogcat')
print(dataSet[0])
输出:
(
( 0 ,.,.) =
215 203 191
206 194 182
211 199 187
⋮
200 191 186
201 192 187
201 192 187( 1 ,.,.) =
215 203 191
208 196 184
213 201 189
⋮
198 189 184
200 191 186
201 192 187
( 2 ,.,.) =
215 201 188
209 195 182
214 200 187
⋮
200 191 186
202 193 188
204 195 190
…
(399,.,.) =
72 90 32
88 106 48
38 56 0
⋮
158 161 106
87 85 36
105 98 52
[torch.ByteTensor of size 400x300x3], 1)
上面的数据处理有下面的问题:
1.返回的样本的形状大小不一致,每一张图片的大小不一样。这对于需要batch训练的神经网络来说很不友好。
2. 返回的数据样本数值很大,没有归一化【-1,1】
对于上面的问题,pytorch torchvision 是一个视觉化的工具包,提供了很多的图像处理的工具,其中transforms模块提供了对PIL image对象和Tensor对象的常用操作。
对PIL Image常见的操作如下;
Resize 调整图片的尺寸,长宽比保持不变
CentorCrop ,RandomCrop,RandomSizeCrop 裁剪图片
Pad 填充
ToTensor 将PIL Image 转换为Tensor,会自动将[0,255] 归一化至[0,1]
对Tensor 的操作如下:
Normalize 标准化,即减均值,除以标准差
ToPILImage 将Tensor转换为 PIL Image对象
版本2
#数据处理
import os
import torch
from torch.utils import data
from PIL import Image
import numpy as np
from torchvision import transformstransform=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]])













闽公网安备 35020302000061号