持续创造,加快生长!这是我参加「日新方案 10 月更文挑战」的第18天,点击检查活动详情

1.环境装备及要求

  1. pytorch1.12.1
  2. numpy 1.23.3
  3. python 3.8
  4. pandas 1.2.4
  5. matplotlib 3.5.1
  6. jupyter note运转

2.要解决的问题

丢掉法的出现仍是为了解决过拟合的问题,过拟合是指:模型的练习误差远小于它在测验数据集上的误差,咱们称该现象为过拟合。

3.丢掉法原理及办法

原理便是当对躲藏层运用丢掉法时,该层的躲藏单元将有一定概率被丢掉掉,即通过概率挑选的方法对数据进行处理。丢掉概率是丢掉法的超参数,且丢掉法不改变其输入的期望值。

深度学习中丢弃法原理及实现(基于pytorch)
因为在练习中躲藏层神经元的丢掉是随机的,即h1,….h5都有或许被清零,输出层的计算无法过度依靠h1,。。。h5中的任意一个,从而在练习模型时起到正则化的作用,并能够用来应对过拟合。当然咱们在测验的时分,为了成果确实定性,一般不适用丢掉法,仅是在测验的时分!

4.丢掉法的完成

根据丢掉法的界说,咱们能够进一步完成它,其中dropout函数将以drop_prob的概率丢掉x中的元素。

4.1 导入环境

深度学习中丢弃法原理及实现(基于pytorch)

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函数

深度学习中丢弃法原理及实现(基于pytorch)

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.

深度学习中丢弃法原理及实现(基于pytorch)

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.

深度学习中丢弃法原理及实现(基于pytorch)

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

这儿咱们应该留意一点,对模型评估的时分不应该进行丢掉。

深度学习中丢弃法原理及实现(基于pytorch)

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 练习和测验模型

这一部分与之前多层感知机的练习和测验相似。

深度学习中丢弃法原理及实现(基于pytorch)

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)