数据增强
主要是这部分代码,transform的一些列api,
def load_data(batch_size):train_loader = torch.utils.data.DataLoader(datasets.MNIST('../data', train=True, download=True,transform=pose([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链接在一起
pose(transforms)
比如上图的例子,将组成的变换列表放到了一起
transform=pose([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 torchfrom 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)+outout = F.relu(out) return outclass 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 xdef 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()