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)直接在优化器中使用即可.