DropOut
DropOut是神经网络中一种防止过拟合的手段,其主要的原理是在每一次的训练过程中 放置几个神经元,不对进行训练,他的参数不会进行更新,但是在实际测试训练集的时候.所有的神经元都会被用到,
正则化
正则化同样是一种防止过拟合的手段, L1,L2两种模式进行,第一种是对所有的权值的绝对值进行加操作,L2则是对权值的平方进行加操作,Li会导致部分权值为0,L2会导致部分权值为捷径0.
代码修改如下
使用DropOut之后,模型修改如下:
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
#Sequential表示将不同的功能组合起来
self.layer1 = nn.Sequential(nn.Linear(784, 500), nn.Dropout(p=0.5), nn.Tanh()) # Drop参数表示多少的神经元不工作
self.layer2 = nn.Sequential(nn.Linear(500, 300), nn.Dropout(p=0.5), nn.Tanh()) # Drop参数表示多少的神经元不工作
#上面是两个隐藏层
self.layer3 = nn.Sequential(nn.Linear(300, 10), nn.Dropout(p=0.5), nn.Softmax(dim=1) ) # Drop参数表示多少的神经元不工作
def forward(self,x):
#数据输入是4维数据,[64, 1, 28, 28]->[64,784]
x = x.view(x.size()[0], -1) # 获得值64,view相当于reshape,第一个值为64,第二个值为-1相当于自动匹配
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
return x
不使用DropOut,使用正则化,模型修改如下:
#设置L2正则化
optimizer = optim.SGD(model.parameters(),LR,weigth_decay=0.0001)
直接在优化器中使用即可.