17.Train-Val-Test划分、Regularization正则化

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)

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments