PyTorch 模型训练实用教程(二):数据

tech2022-08-11  144

目录

简介

随机裁剪

Totensor

数据标准化(减均值,除以标准差)

transforms 的⼆⼗⼆个⽅法

1. 裁剪——Crop

中心裁剪:transforms.CenterCrop

随机裁剪:transforms.RandomCrop

随机长宽比裁剪:transforms.RandomResizedCrop

上下左右中心裁剪:transforms.FiveCrop

上下左右中心裁剪后翻转,transforms.TenCrop

2. 翻转和旋转——Flip and Rotation

依概率 p 水平翻转

依概率 p 垂直翻转

随机旋转

3.图像变换

resize:transforms.Resize

标准化:transforms.Normalize

转为 tensor:transforms.ToTensor

填充:transforms.Pad

修改亮度、对比度和饱和度:transforms.ColorJitter

转灰度图:transforms.Grayscale

线性变换:transforms.LinearTransformation()

仿射变换:transforms.RandomAffine

依概率 p 转为灰度图:transforms.RandomGrayscale

将数据转换为 PILImage:transforms.ToPILImage

transforms.Lambda

4.对 transforms 操作,使数据增强更灵活

transforms.RandomChoice(transforms)

transforms.RandomApply(transforms, p=0.5)

transforms.RandomOrder


简介

PyTorch 中,这些数据增强方法放在了 transforms.py 文件中。这些数据处理可以满足我们大部分的需求, 我们也可以自定义 数据处理函数,实现自己的数据增强。 # 数据预处理设置 normMean = [0.4948052, 0.48568845, 0.44682974] normStd = [0.24580306, 0.24236229, 0.2603115] normTransform = transforms.Normalize(normMean, normStd) trainTransform = transforms.Compose([ transforms.Resize(32), transforms.RandomCrop(32, padding=4), transforms.ToTensor(), normTransform ]) validTransform = transforms.Compose([ transforms.ToTensor(), normTransform ]) 前三行设置均值,标准差,以及数据标准化: transforms.Normalize() 函数,这里是以通道为单位进行计算均值,标准差。 然后用 transforms.Compose 将所需要进行的处理给 compose 起来,并且需要注意顺序! 在训练时,依次对图片进行以下操作: 1. 随机裁剪 2. Totensor 3. 数据标准化 ( 减均值,除以标准差 )

随机裁剪

在裁剪之前先对图片的上下左右均填充上 4 pixel ,值为0 ,即变成一个 36*36 的数据,然后再随机进行 32*32 的裁剪。

Totensor

第二个处理是 transforms.ToTensor() 在这里会对数据进行 transpose ,原来是 h*w*c ,会经过 img = img.transpose(0,1).transpose(0, 2).contiguous() ,变成 c*h*w 再除以 255 ,使得像素值归一化至 [0-1] 之间.

数据标准化(减均值,除以标准差)

在进行 Normalize 时,需要设置均值和方差,在这里直接给出了,但在实际应用中是要去训练集中计算的,天下可没有免费的午餐。 # coding: utf-8 import numpy as np import cv2 import random import os """ 随机挑选CNum张图片,进行按通道计算均值mean和标准差std 先将像素从0~255归一化至 0-1 再计算 """ train_txt_path = os.path.join("..", "..", "Data/train.txt") CNum = 2000 # 挑选多少图片进行计算 img_h, img_w = 32, 32 imgs = np.zeros([img_w, img_h, 3, 1]) means, stdevs = [], [] with open(train_txt_path, 'r') as f: lines = f.readlines() random.shuffle(lines) # shuffle , 随机挑选图片 for i in range(CNum): img_path = lines[i].rstrip().split()[0] img = cv2.imread(img_path) img = cv2.resize(img, (img_h, img_w)) img = img[:, :, :, np.newaxis] imgs = np.concatenate((imgs, img), axis=3) print(i) imgs = imgs.astype(np.float32)/255. for i in range(3): pixels = imgs[:,:,i,:].ravel() # 拉成一行 means.append(np.mean(pixels)) stdevs.append(np.std(pixels)) means.reverse() # BGR --> RGB stdevs.reverse() print("normMean = {}".format(means)) print("normStd = {}".format(stdevs)) print('transforms.Normalize(normMean = {}, normStd = {})'.format(means, stdevs))

transforms 的⼆⼗⼆个⽅法

本小节对 transforms.py 中的各个预处理方法进行介绍和总结。主要从官方文档中总结而来,官方文档只是将方法陈列,没有归纳总结,顺序很乱,这里总结一共有四大类,方便大家索引:

1. 裁剪——Crop

中心裁剪:transforms.CenterCrop

class torchvision.transforms.CenterCrop ( size ) 功能:依据给定的 size 从中心裁剪 参数: size- (sequence or int) ,若为 sequence, 则为 (h,w) ,若为 int ,则 (size,size)

随机裁剪:transforms.RandomCrop

class torchvision.transforms.RandomCrop ( size , padding=None , pad_if_needed=False , fill=0 ,padding_mode='constant' ) 功能:依据给定的 size 随机裁剪 参数:  size- (sequence or int) ,若为 sequence, 则为 (h,w) ,若为 int ,则 (size,size) padding- (sequence or int, optional) ,此参数是设置填充多少个 pixel 当为 int 时,图像上下左右均填充 int 个,例如 padding=4 ,则上下左右均填充 4 pixel ,若为 32*32 ,则会变成 40*40 当为 sequence 时,若有 2 个数,则第一个数表示左右扩充多少,第二个数表示上下的。当有 4 个数时,则为左,上,右,下。 fill- (int or tuple) 填充的值是什么(仅当填充模式为 constant 时有用)。 int 时,各通道均填充该值,当长度为 3 tuple 时,表示 RGB 通道需要填充的值。 padding_mode- 填充模式,这里提供了 4 种填充模式, 1.constant ,常量。 2.edge 按照图片 边缘的像素值来填充。 3.reflect ,暂不了解。 4. symmetric ,暂不了解。

随机长宽比裁剪:transforms.RandomResizedCrop

class torchvision.transforms.RandomResizedCrop ( size , scale=(0.08 , 1.0) , ratio=(0.75 , 1.3333333333333333) , interpolation=2 ) 功能:随机大小,随机长宽比裁剪原始图片,最后将图片 resize 到设定好的 size 参数: size- 输出的分辨率 scale- 随机 crop 的大小区间,如 scale=(0.08, 1.0) ,表示随机 crop 出来的图片会在的 0.08倍至 1 倍之间。 ratio- 随机长宽比设置 interpolation- 插值的方法,默认为双线性插值 ( PIL.Image.BILINEAR )

上下左右中心裁剪:transforms.FiveCrop

class torchvision.transforms.FiveCrop ( size ) 功能: 对图片进行上下左右以及中心裁剪,获得 5 张图片,返回一个 4D-tensor 参数: size- (sequence or int) ,若为 sequence, 则为 (h,w) ,若为 int ,则 (size,size)

上下左右中心裁剪后翻转,transforms.TenCrop

class torchvision.transforms.TenCrop(size, vertical_flip=False)

功能: 对图片进行上下左右以及中心裁剪,然后全部翻转(水平或者垂直),获得 10 张图片,返回一个 4D-tensor 参数: size- (sequence or int) ,若为 sequence, 则为 (h,w) ,若为 int ,则 (size,size) vertical_flip ( bool ) - 是否垂直翻转,默认为 flase ,即默认为水平翻转

2. 翻转和旋转——Flip and Rotation

依概率 p 水平翻转

class torchvision.transforms.RandomHorizontalFlip ( p=0.5 ) 功能: 依据概率 p PIL 图片进行水平翻转 参数: p- 概率,默认值为 0.5

依概率 p 垂直翻转

class torchvision.transforms.RandomVerticalFlip ( p=0.5 ) 功能: 依据概率 p PIL 图片进行垂直翻转 参数: p- 概率,默认值为 0.5

随机旋转

class torchvision.transforms.RandomRotation ( degrees , resample=False , expand=False , center=None ) 功能: degrees 随机旋转一定角度 参数: degress- ( sequence or float or int ) 若为单个数,如 30,则表示在(-30+30)之间随机旋若为 sequence,如(3060),则表示在 30-60 度之间随机旋转resample- 重采样方法选择,可选PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC,默认为最近邻 expand- ? center- 可选为中心旋转还是左上角旋转

3.图像变换

resizetransforms.Resize

class torchvision.transforms.Resize ( size , interpolation=2 ) 功能: 重置图像分辨率 参数: size- If size is an int, if height > width, then image will be rescaled to (size * height / width,size) ,所以建议 size 设定为 h*w

interpolation- 插值方法选择,默认为 PIL.Image.BILINEAR

标准化:transforms.Normalize

class torchvision.transforms.Normalize ( mean , std ) 功能:对数据按通道进行标准化,即先减均值,再除以标准差,注意是 h*w*c

转为 tensortransforms.ToTensor

class torchvision.transforms.ToTensor 功能: PIL Image 或者 ndarray 转换为 tensor ,并且归一化至 [0-1] 注意事项: 归一化至 [0-1] 是直接除以 255 ,若自己的 ndarray 数据尺度有变化,则需要自行修改。

填充:transforms.Pad

class torchvision.transforms.Pad ( padding , fill=0 , padding_mode='constant' ) 功能:对图像进行填充 参数: padding- (sequence or int, optional) ,此参数是设置填充多少个 pixel 当为 int 时,图像上下左右均填充 int 个,例如 padding=4 ,则上下左右均填充 4 pixel ,若为 32*32 ,则会变成 40*40 当为 sequence 时,若有 2 个数,则第一个数表示左右扩充多少,第二个数表示上下的。当 4 个数时,则为左,上,右,下。 fill- (int or tuple) 填充的值是什么(仅当填充模式为 constant 时有用)。 int 时,各通道均填充该值,当长度为 3 tuple 时,表示 RGB 通道需要填充的值。 padding_mode- 填充模式,这里ᨀ供了 4 种填充模式, 1.constant ,常量。 2.edge 按照图片边缘的像素值来填充。 3.reflect ,? 4. symmetric ,?

修改亮度、对比度和饱和度:transforms.ColorJitter

class torchvision.transforms.ColorJitter ( brightness=0 , contrast=0 , saturation=0 , hue=0 ) 功能:修改修改亮度、对比度和饱和度

转灰度图:transforms.Grayscale

class torchvision.transforms.Grayscale ( num_output_channels=1 ) 功能:将图片转换为灰度图 参数: num_output_channels- (int) ,当为 1 时,正常的灰度图,当为 3 时, 3 channel with r ==g == b

线性变换:transforms.LinearTransformation()

class torchvision.transforms.LinearTransformation ( transformation_matrix ) 功能:对矩阵做线性变化,可用于白化处理! whitening: zero-center the data, computethe data covariance matrix 参数: transformation_matrix ( Tensor ) – tensor [D x D], D = C x H x W

仿射变换:transforms.RandomAffine

class torchvision.transforms.RandomAffine ( degrees , translate=None , scale=None , shear=None , resample=False , fillcolor=0 ) 功能:仿射变换

依概率 p 转为灰度图:transforms.RandomGrayscale

class torchvision.transforms.RandomGrayscale ( p=0.1 ) 功能:依概率 p 将图片转换为灰度图,若通道数为 3 ,则 3 channel with r == g == b

将数据转换为 PILImagetransforms.ToPILImage

class torchvision.transforms.ToPILImage ( mode=None ) 功能:将 tensor 或者 ndarray 的数据转换为 PIL Image 类型数据 参数: mode- None 时,为 1 通道, mode=3 通道默认转换为 RGB 4 通道默认转换为 RGBA

transforms.Lambda

Apply a user-defined lambda as a transform. 暂不了解,待补充

4.transforms 操作,使数据增强更灵活

PyTorch 不仅可设置对图片的操作,还可以对这些操作进行随机选择、组合

transforms.RandomChoice(transforms)

功能:从给定 的一系列 transforms 中选一个进行操作 randomly picked from a list

transforms.RandomApply(transforms, p=0.5)

功能:给一个 transform 加上概率,以一定的概率执行该操作

transforms.RandomOrder

功能:将 transforms 中的操作顺序随机打乱
最新回复(0)