数据增强、随机种子、cifar图像识别

  • Post author:
  • Post category:其他




数据增强

主要是这部分代码,transform的一些列api,

def load_data(batch_size):
    train_loader = torch.utils.data.DataLoader(
        datasets.MNIST('../data', train=True, download=True,
                       transform=transforms.Compose([
                           transforms.RandomHorizontalFlip(),
                           transforms.RandomVerticalFlip(),
                           transforms.RandomRotation(15),
                           # transforms.RandomRotation((-90, 90)),
                           transforms.Resize([32, 32]),
                           transforms.RandomCrop([28, 28]),
                           transforms.ToTensor(),
                           # transforms.Normalize((0.1307,), (0.3081,))
                       ])),
        batch_size=batch_size, shuffle=True)

数据的增强常用的比如变换,把需要的操作用Compose链接在一起

torchvision.transforms.Compose(transforms)

比如上图的例子,将组成的变换列表放到了一起

transform=transforms.Compose([
                           transforms.RandomHorizontalFlip(),
                           transforms.RandomVerticalFlip(),
                           transforms.RandomRotation(15),
                           # transforms.RandomRotation((-90, 90)),
                           transforms.Resize([32, 32]),
                           transforms.RandomCrop([28, 28]),
                           transforms.ToTensor(),



常用的几种变换


·

Crop裁剪分为:

中心裁剪:

transforms.CenterCrop


随机裁剪:

transforms.RandomCrop


随机长宽比裁剪:

transforms.RandomResizedCrop


上下左右中心裁剪:

transforms.FiveCrop


上下左右中心裁剪后翻转:

transforms.TenCrop



·

Flip Rotation翻转和旋转:

依概率p水平翻转

transforms.RandomHorizontalFlip(p=0.5)


依概率p垂直翻转

transforms.RandomVerticalFlip(p=0.5)


随机旋转

transforms.RandomRotation



·

Resize图像变换

标准化

transforms.Normalize


转为tensor,并归一化至[0-1]

transforms.ToTensor


填充

transforms.Pad


修改亮度、对比度和饱和度:

transforms.ColorJitter


转灰度图:transforms.Grayscale

线性变换:

transforms.Grayscale


仿射变换:

transforms.RandomAffine


依概率p转为灰度图:

transforms.RandomGrayscale


将数据转换为PILImage:

transforms.ToPILImage transforms.Lambda



·

对transform操作,使数据增强更灵活

从给定的一系列transforms中选一个进行操作

transforms.RandomChoice(transforms)


给一个transform加上概率,依概率进行操作

transforms.RandomApply(transforms, p=0.5)


将transforms中的操作随机打乱

transforms.RandomOrder



随机种子

在深度学习时,有大量参数是随机初始化的,我们就会设置这些参数,数据在使用时,也经常需要随机抽取,那么对于同一组实验而言,每次都是不同的数据就没有可比性和实验的必要了,那么我们固定每次随机的数据,那么每次试验就对同一组随机数据不停的实验,那就可以对比了。

例子:

def seed_all(random_seed):
    torch.manual_seed(random_seed)
    np.random.seed(random_seed)
    random.seed(random_seed)

1.为cpu中设置种子,生成随机数

为CPU中设置种子,生成随机数

2.为GPU

torch.cuda.manual_seed(seed)

3.为所有GPU设置种子,生成随机数

torch.cuda.manual_seed_all(seed)

4.在Numpy内部也有随机种子,当你使用numpy中的随机数的时候,可以通过如下方式固定:

np.random.seed(seed)(另外还有python的内置模块random.seed(seed)



cifar图像识别

该数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图。这里面有50000张用于训练,构成了5个训练批,每一批10000张图;另外10000用于测试,单独构成一批。测试批的数据里,取自10类中的每一类,每一类随机取1000张。抽剩下的就随机排列组成了训练批。注意一个训练批中的各类图像并不一定数量相同,总的来看训练批,每一类都有5000张图。

在这里插入图片描述

import torch
from torch import nn#神经网络
from torch.nn import functional as F #函数

class ResBlk(nn.Module):#自定义层
	def __init__(self, ch_in, ch_out, stride=1)
		super.(ResBlk,self).__init__()
		self.conv1 = nn.Conv2d(cd_in, ch_out, kernel_size=3, stride=stride, padding=1)
		self.bn1 = nn.BatchNorm2d(ch_out)#批量数据转化
		self.conv2 = nn.Conv2d(ch_out, cha_out, kerne_size=3, stride=1,padding=1)
		self.bn2 = nn.BatchNorm2d(ch_out)
		self.extra = nn.Sequential()#序列
		if ch_out != ch_in:
			#[b, ch_in, h, w] =>[b, ch_out,h ,w]
			self.extra = nn.Sequential(
				nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=stride),
				nn.BatchNorm2d(ch_out)
			)
	def forward(self. x):# 权重计算
		out = F.relu(self.bn1(self.conv1(x)))
		out = self.bn2(self.conv2(out))
		out = self.extra(x)+out
		out = F.relu(out) 		
		return out

class ResNet18(nn.Module):#继承神经网络
	def __init__(self):
		super(ResNet18, self).__init__()
		#设置卷积
		self.conv1=nn.Sequential(
			nn.Conv2d(3, 64, kernel_size=3, stride=3, padding=0),
			nn.BatchNorm2d(64)
		)
		self.blk1=ResBlk(64, 128, stride=2)
		self.blk1=ResBlk(128, 256, stride=2)
		self.blk1=ResBlk(256, 512, stride=2)
		self.blk1=ResBlk(512, 512, stride=2)
		self.outlayer = nn.Linear(512 * 1 * 1, 10)#处理10个分类

	def forward(self, x):
		x = F.relu(self.con1(x))
		
		x=self.blk1(x)
		x=self.blk2(x)
		x=self.blk3(x)
		x=self.blk4(x)
		x=F.adaptive_avg_pool2d(x, [1,1])
		x=x.view(x.size(0), -1)
		x= self.outlayer(x)
		return x
	def main():
		blk= ResBlk(64, 128, stride=4)
		tmp = torch.randn(2, 64, 32, 32)
		out = blk(tmp)
		print('block:', out.shape)
		x=torch.randn(2,3,32,32)
		model = ResNet18()
		out = model(x)
		print('resnet:',out.shape)
if __name__ =='main':
	main()




版权声明:本文为weixin_45797937原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。