pytorch入门与实践学习笔记:chapter5 工具篇

目录

 

1.数据加载

2.数据预处理

torchvision.transforms.Compose(transforms)

torchvision.transforms.Scale(size, interpolation=2)

torchvision.transforms.CenterCrop(size)

torchvision.transforms.RandomCrop(size, padding=0)

torchvision.transforms.RandomHorizontalFlip

torchvision.transforms.RandomSizedCrop(size, interpolation=2)

torchvision.transforms.Pad(padding, fill=0)

torchvision.transforms.Normalize(mean, std)

torchvision.transforms.ToTensor

 torchvision.transforms.ToPILImage

 torchvision.transforms.Lambda(lambd)


1.数据加载

数据集对象抽象成Dataset类,实现自定义的数据集需要继承Dataset。

  • __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.Dataste ):
    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 range 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, imgs)

具体调用方式:

dataset = DogCat( './path_to_dataset' )
img, label = dataset[0]
for img, label in dataste:
    print( img.size(), img.float().mean(), label )

2.数据预处理

torchvision.transforms模块对PIL Image 和tensor进行处理的操作:

将多个transform组合起来使用。

transforms: 由transform构成的列表。 如果要对图片进行多个操作,可通过‘Compose’函数将这些操作拼接起来,类似于`nn.Sequential`。注意,这些操作定义后是以函数的形式存在,真正使用时需调用它的‘__call__’方法,这点类似于‘nn.Module’。例如要将图片调整为224* 224,首先应构建这个操作 trans = Scale((224, 224)),然后调用 trans(img) 例子:

transforms.Compose([

     transforms.CenterCrop(10),

     transforms.ToTensor(),

 ])
  • torchvision.transforms.Scale(size, interpolation=2)

将输入的`PIL.Image`重新改变大小成给定的`size`,`size`是最小边的边长。举个例子,如果原图的`height>width`,那么改变大小后的图片大小是`(size*height/width, size)`。

from torchvision import transforms
from PIL import Image

crop = transforms.Scale(12)

img = Image.open('test.jpg')

print(type(img))

print(img.size)

croped_img=crop(img)

print(type(croped_img))

print(croped_img.size)

输出:

< 'PIL.PngImagePlugin.PngImageFile'>

(10, 10)

< 'PIL.Image.Image'>

(12, 12)

将给定的PIL.Image进行中心切割,得到给定的size,size可以是tuple,(target_height, target_width)。size也可以是一个Integer,在这种情况下,切出来的图片的形状是正方形。

切割中心点的位置随机选取。size可以是tuple也可以是Integer。

随机水平翻转给定的PIL.Image,概率为0.5。即:一半的概率翻转,一半的概率不翻转。

先将给定的PIL.Image随机切,然后再resize成给定的size大小。

将给定的PIL.Image的所有边用给定的pad value填充。 padding:要填充多少像素 fill:用什么值填充 例子:

from torchvision import transforms

from PIL import Image

padding_img = transforms.Pad(padding=10, fill=0)

img = Image.open('test.jpg')

print(type(img))

print(img.size)

padded_img=padding(img)

print(type(padded_img))

print(padded_img.size)
#输出:
<'PIL.PngImagePlugin.PngImageFile'>
(10, 10)
<'PIL.Image.Image'>
(30, 30) 
#由于上下左右都要填充10个像素,所以填充后的size是(30,30)

torchvision.transforms.Normalize(mean, std)

给定均值:(R,G,B) 方差:(R,G,B),将会把Tensor正则化。即:Normalized_image=(image-mean)/std。

torchvision.transforms.ToTensor

把一个取值范围是[0,255]的PIL.Image或者shape为(H,W,C)的numpy.ndarray,转换成形状为[C,H,W],取值范围是[0,1.0]的torch.FloadTensor

data = np.random.randint(0, 255, size=300)
img = data.reshape(10,10,3)
print(img.shape)
img_tensor = transforms.ToTensor()(img) 
# 转换成tensor
print(img_tensor)

 torchvision.transforms.ToPILImage

将shape为(C,H,W)的Tensor或shape为(H,W,C)的numpy.ndarray转换成PIL.Image,值不变。

 torchvision.transforms.Lambda(lambd)

使用lambd作为转换器。例如,如若对PIL Image 进行随机旋转,则可以写成:trans = T.Lambda( lambda img : img.rotate(random()  * 360 ))

未完待续。。。有空再写

个人笔记,有错望指出,感激不尽。

猜你喜欢

转载自blog.csdn.net/qq_33427431/article/details/85802741