1.数据集划分:
- hold-out(留出法)
直接将数据集划分为两个互斥的集合
但是这种方法,只有新划分的训练集会参与到backward过程中
- K-fold cross-validation(K折交叉验证)
即把数据分成K份,每次拿出一份作为验证集,剩下k-1份作为训练集,重复K次。最后平均K次的结果,作为误差评估的结果。
这种方法可以将验证集充分利用起来,从而使得每个数据集都可以参与到backward过程中。
不过这种方法对模型的提升有限,毕竟数据集并没有增加。
import torch
from torchvision import datasets, transforms
batch_size = 200
# 读取训练集和测试集
# pytorch只提供了train和test这两种原生的数据集划分,通过设置train=True或者False实现
train_db = datasets.MNIST('../data', train=True, download=True,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
]))
test_db = datasets.MNIST('../data', train=False,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
]))
print('train:',len(train_db),'test:',len(test_db))
# 将原有训练集(60k)划分为新的训练集(50k)和验证集(10k)
train_db,val_db = torch.utils.data.random_split(train_db,[50000,10000])
print('train_db:',len(train_db),'val_db:',len(val_db))
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)
test_loader = torch.utils.data.DataLoader(test_db,batch_size=batch_size,shuffle=True)
运行结果如下:
train: 60000 test: 10000
train_db: 50000 val_db: 10000
2.Regularization(正则化):
设置正则化是为了减小模型复杂度,从而用来克服over-fitting的,如果网络本身就没有发生over-fitting,那么如果设置了正则化项就会导致网络的表达能力不足,引起网络的performance急剧下降。
在pytorch或者其他文档中也叫作Weight Decay
(权值衰减)。
通过上面的图可以直观看到,通过设置了正则化项,使得模型表达能力能够被约束下来,得到一个平滑分界线。
- L1 Regularization
在PyTorch中还没有直接设置L1范数的方法,可以在训练时Loss做BP之前(也就是.backward()之前)手动为Loss加上L1范数:
# 设置L1正则化项
regularization_loss = 0
# 对网络中所有参数进行一个迭代
for param in net.parameters():
regularization_loss += torch.sum(torch.abs(param)) # 求得L1范数,再累加到regularization_loss
classify_loss = Loss(logits, target)
# 新的会有一个λ参数乘以regularization_loss
loss = classify_loss + 0.01 * regularization_loss
optimizer.zero_grad()
# 对新的loss进行backward
loss.backward()
optimizer.step()
- L2 Regularization(较常用)
在pytorch中可以很方便地操作,只要直接在训练前为optimizer设置正则化项的λ
参数weight_decay
。optimizer = optim.SGD(net.parameters(), lr=learning_rate, weight_decay=0.01)