检测过拟合 —— 交叉验证
- 验证集,用来挑选模型参数(超参数),不参与训练
- 测试集只用来测试,与验证集操作相同,只是数据集不同
# train=True
train_db = datasets.MNIST('../data', train=True, download=True,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
]))
# train和val划分
train_db, val_db = torch.utils.data.random_split(train_db, [50000,10000])
train_loader = torch.utils.data.DataLoader(train_db, batch_size=batch_size, shuffle=True)
val_loader = torch.utils.data.DataLoader(val_db, batch_size=batch_size, shuffle=True)
减少过拟合
- 更多数据
- 模型约束(变浅和正则化)
- dropout
- 数据增强
- 提前结束
optimizer = optim.SGD(net.parameters(), lr=learning_rate, weight_decay=0.01)
# L1范数
re_loss = 0
for param in model.parameters():
re_loss += torch.sum(torch.abs(param))
loss = criteon(logits,y) + 0.01*reloss
optimizer.zero_grad()
loss.backward()
optimizer.step()
动量加速
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
Dropout
net_dropped = torch.nn.Sequential(
torch.nn.Linear(784,200),
torch.nn.Dropout(0.5),
torch.nn.ReLU())
BN层
方便调参、稳定、收敛加快、更好的表现
每个通道都有一个μ和σ
β和γ用来改变分布,学习出来的
# 与通道数一致
BN = nn.BatchNorm2d(3)
nn.Module
- 所有layer的父类,提供函数
- 提供容器
- 提供参数,传入函数方便
- list(XX.parameters())[0]
- list(XX.named_parameters())
- dict(XX.named_parameters()).items()
- 根节点和子节点,调用方便
- cpu转换成gpu方便
- save和load
- train和test
- 自定义层 —— 例如定义打平类放入网络类,只有类才能放入类
- 自定义类 —— nn.Parameter(),这样参数就可以用优化器优化了
数据增强 —— 旋转、裁剪、随即移动、GAN、缩放、加噪声
都在torch.utils.data.DataLoader的参数设置里
缩放:
Pytorch transforms.Resize()的简单用法_xiongxyowo的博客-CSDN博客_transforms.resize