PyTorch自用笔记(第五周)
9.6 Module模块
1.所有网络层次类的一个父类
如:
nn.Linear
nn.BatchNorm2d
nn.Conv2d
自定义类
class MyLinear(nn.Module):
def __init__(self, inp, outp):
super(MyLinear, self).__init__()
#requires_grad = True
self.w = nn.Parameter(torch.randn(outp, inp))
self.b = nn.Parameter(torch.randn(outp))
def forward(self, x):
x = x @ self.w.t() + self.b
return x
2.嵌套
优点/功能:
1.大量现成层次的接口
2.Container
nn.Sequential # 按顺序执行
3.参数管理
4.children:直系亲属
modules:非直系亲属
5.to(device) # cpu/gpu/cuda
6.保存和加载
torch.save(net.state_dict(), 'ckpt.mdl') # 保存当前状态到ckpt.mdl文件
net.load_state_dict(torch.load('ckpt.mdl')) # 加载train好的状态
7.train/test
net.train()
net.eval()
8.自定义类
# Flatten
class Flatten(nn.Module):
def __init__(self):
super(Flatten, self).__init()
def forward(self, input):
return input.view(input, size(0), -1)
class TestNet(nn.Module):
def __init__(self):
super(TestNet, self).__init__()
self.net = nn.Sequential(nn.Conv2d(1, 16, stride=1, padding=1),
nn.MaxPool2d(2, 2),
Flatten(),
nn.Linear(1*14*14, 10))
def forward(self, x):
return self.net(x)
# 自定义线性层
class MyLinear(nn.Module):
def __init__(self, inp, outp):
super(MyLinear, self).__init__()
#requires_grad = True
self.w = nn.Parameter(torch.randn(outp, inp))
self.b = nn.Parameter(torch.randn(outp))
def forward(self, x)
x = x @ self.w.t() + self.b
return x
9.7 数据增强
由于神经网络需要大量的数据,从已有的数据中心扩充出更多的数据供网络进行学习
1.减少参数量
2.正则化
3.数据增强
常用数据增强的手段:
1.翻转
transform.RandomHorizontalFlip() # 水平翻转
transforms.RandomVerticalFlip() # 垂直翻转
# Random表示随机进行翻转
2.旋转
transforms.RandomRotation(15) # 旋转15°
transforms.RandomTotation([90, 180, 270]) # 随机旋转90/180/270
3.随机移动和裁剪
# scale缩放
transforms.Resize([32, 32])
# 部分裁剪
transforms.RandomCrop([28, 28])
transforms.Compose([, , ,]) # 类似nn.Sequential
4.噪声
5.GAN(对抗生成网络)
十、CIFAR10与ResNet实战
10.1 CIFAR10数据集
CIFAR-10数据集由10个类的60000个32x32彩色图像组成,每个类有6000个图像。有50000个训练图像和10000个测试图像。
数据集分为五个训练批次和一个测试批次,每个批次有10000个图像。测试批次包含来自每个类别的恰好1000个随机选择的图像。训练批次以随机顺序包含剩余图像,但一些训练批次可能包含来自一个类别的图像比另一个更多。总体来说,五个训练集之和包含来自每个类的正好5000张图像。
以下是数据集中的类,以及来自每个类的10个随机图像