1. 了解知道Dropout原理
-
Dropout一种Regularization的方法,与L1、L2正则化和最大范式约束等方法互为补充。在训练的时候,dropout的实现方法是让神经元以超参数 p 的概率被激活或者被设置为0。
-
在训练过程中,随机失活可以被认为是对完整的神经网络抽样出一些子集,每次基于输入数据只更新子网络的参数(然而,数量巨大的子网络们并不是相互独立的,因为它们都共享参数)。
-
在测试过程中不使用随机失活,所有的神经元都激活,但是对于隐层的输出都要乘以 p 。可以理解为是对数量巨大的子网络们做了模型集成(model ensemble),以此来计算出一个平均的预测。详见:http://cs231n.github.io/neural-networks-2/
-
一般在全连接层把神经元置为0,在卷积层中可能把某个通道置为0。
2. 用代码实现正则化(L1、L2、Dropout)
# 包
import torch
import torch.nn as nn
import torch.nn.functional as F
# torchvision 包收录了若干重要的公开数据集、网络模型和计算机视觉中的常用图像变换
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
regularization_loss = 0
for param in model.parameters():
regularization_loss += torch.sum(abs(param))
calssify_loss = criterion(pred,target)
loss = classify_loss + lamda * regularization_loss
optimizer.zero_grad()
loss.backward()
optimizer.step()
optimizer = torch.optim.SGD(model.parameters(),lr=0.01,weight_decay=0.001)
torch.manual_seed(1) # Sets the seed for generating random numbers.reproducible
N_SAMPLES