数据增强
主要是这部分代码,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.Resize([32, 32]),
transforms.RandomCrop([28, 28]),
transforms.ToTensor(),
])),
batch_size=batch_size, shuffle=True)
数据的增强常用的比如变换,把需要的操作用Compose链接在一起
torchvision.transforms.Compose(transforms)
比如上图的例子,将组成的变换列表放到了一起
transform=transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(),
transforms.RandomRotation(15),
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:
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)
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()
|