持续创造,加快生长!这是我参加「日新方案 10 月更文挑战」的第18天,点击检查活动详情
1.环境装备及要求
- pytorch1.12.1
- numpy 1.23.3
- python 3.8
- pandas 1.2.4
- matplotlib 3.5.1
- jupyter note运转
2.要解决的问题
丢掉法的出现仍是为了解决过拟合的问题,过拟合是指:模型的练习误差远小于它在测验数据集上的误差,咱们称该现象为过拟合。
3.丢掉法原理及办法
原理便是当对躲藏层运用丢掉法时,该层的躲藏单元将有一定概率被丢掉掉,即通过概率挑选的方法对数据进行处理。丢掉概率是丢掉法的超参数,且丢掉法不改变其输入的期望值。 因为在练习中躲藏层神经元的丢掉是随机的,即h1,….h5都有或许被清零,输出层的计算无法过度依靠h1,。。。h5中的任意一个,从而在练习模型时起到正则化的作用,并能够用来应对过拟合。当然咱们在测验的时分,为了成果确实定性,一般不适用丢掉法,仅是在测验的时分!
4.丢掉法的完成
根据丢掉法的界说,咱们能够进一步完成它,其中dropout函数将以drop_prob的概率丢掉x中的元素。
4.1 导入环境
import matplotlib_inline
import torch
import torch.nn as nn
import numpy as np
import sys
sys.path.append(r"E:\anaconda\envs\pytorch\Lib\d2lzh_pytorch")
import d2lzh_pytorch as d2l
这儿仍是运用之前的库包版别,一般情况下更高的版别能够向下兼容。留意导入d2l包,途径的放置前假如报错了要留意在途径前添加r。
4.2设置丢掉函数即dropout函数
def dropout(X,drop_prob):
X=X.float()
assert 0<=drop_prob<=1
keep_prob=1-drop_prob
#这种情况下把悉数元素都丢掉
if keep_prob==0:
return torch.zeros_like(X)#输出以Xshape相同的形状
mask=(torch.randn(X.shape)<keep_prob).float()
return mask*X/keep_prob
这儿咱们将丢掉函数设置好后能够对其进行测验:
X=torch.arange(16).view(2,8)
dropout(X,0)#丢掉率为0
dropout(X,0.5)#丢掉率为0.5
dropout(X,1)#丢掉率为1
能够很明显的看出,当概率设置为0时,X中的元素悉数保留,当概率设置为0.5时,X中的元素有一半设置为0,当概率为1时,X中的元素悉数为0。综上,丢掉函数的功用现已到达咱们的预期要求。
4.3界说模型参数
参数,即咱们的模型需求运用的数据,这儿咱们运用Fashion-MNIST数据集,界说一个包含两个躲藏层的多层感知机,其中两个躲藏层的输出个数都是256.
num_inputs,num_outputs,num_hiddens1,num_hiddens2=784,10,256,256
W1=torch.tensor(np.random.normal(0,0.01,size=(num_inputs,num_hiddens1)),dtype=torch.float,requires_grad=True)
b1=torch.zeros(num_hiddens1,requires_grad=True)
W2=torch.tensor(np.random.normal(0,0.01,size=(num_hiddens1,num_hiddens2)),dtype=torch.float,requires_grad=True)
b2=torch.zeros(num_hiddens2,requires_grad=True)
W3=torch.tensor(np.random.normal(0,0.01,size=(num_hiddens2,num_outputs)),dtype=torch.float,requires_grad=True)
b3=torch.zeros(num_outputs,requires_grad=True)
params=[W1,b1,W2,b2,W3,b3]
这儿跟之前的区别不会很大,唯一的区别在于这是个两层躲藏层的方法,即第一层传来的数字进入第二层的时分,第二层再进行计算的一个过程。
4.4 界说模型
这儿就用到咱们之前了解到的一个激活函数,ReLU激活函数,并对每个激活函数的输出运用丢掉法。咱们分别设置各个层的丢掉概率,咱们通常会将输入层的丢掉概率设的小一点,在这儿咱们把第一个躲藏层的丢掉概率设为0.2,把第二个躲藏层的丢掉概率设为0.5.
drop_prob1,drop_prob2=0.2,0.5
def net(X,is_training=True):
X=X.view(-1,num_inputs)
H1=(torch.matmul(X,W1)+b1).relu()
if is_training: #只在练习模型时运用丢掉法
H1=dropout(H1,drop_prob1) #在第一层全衔接后添加丢掉层
H2=(torch.matmul(H1,W2)+b2).relu()
if is_training:
H2=dropout(H2,drop_prob2)#在第二层全衔接后添加丢掉层
return torch.matmul(H2,W3)+b3
这儿咱们应该留意一点,对模型评估的时分不应该进行丢掉。
def evaluate_accuracy(data_iter,net):
acc_sum,n=0.0,0
for X,y in data_iter:
if isinstance(net,torch.nn.Module):
net.eval()#评估形式,这会封闭dropout
acc_sum+=(net(X).argmax(dim=1)==y).float().sum().item()
net.train()#改回练习形式
else:
if('is_training' in net.__code__.co_varnames):#假如有is_training这个参数
acc_sum+=(net(X,is_training=False).argmax(dim=1)==y).float().sum().item()
else:
acc_sum+=(net(X).argmax(dim=1)==y).float().sum().item()
n+=y.shape[0]
return acc_sum/n
4.5 练习和测验模型
这一部分与之前多层感知机的练习和测验相似。
num_epochs,lr,batch_size=5,100.0,256
loss=torch.nn.CrossEntropyLoss()
train_iter,test_iter=d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,params,lr)