开发者社区> 阿旭算法与机器学习> 正文

【从零开始学习深度学习】14. 防止过拟合方法:Dropout方法介绍及示例演示

简介: 【从零开始学习深度学习】14. 防止过拟合方法:Dropout方法介绍及示例演示
+关注继续查看

1 Dropout丢弃法


1.1 方法

image.png

483a673a72464132afec845fb48c2958.png


1.2 从零开始实现带dropout的


根据丢弃法的定义,下面我们去实现它。下面的dropout函数将以drop_prob的概率丢弃X中的元素。


%matplotlib inline
import torch
import torch.nn as nn
import numpy as np
import sys
import d2lzh_pytorch as d2l

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)
    # torch.rand,【0,1)的均匀分布
    mask = (torch.rand(X.shape) < keep_prob).float()
    
    return mask * X / keep_prob


我们运行几个例子来测试一下dropout函数。其中丢弃概率分别为0、0.5和1。

be7ff477d7a74ade90e4205f3c2dda61.png


1.2.1 定义模型参数


实验中,我们依然使用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]


1.2.2 定义模型


下面定义的模型将全连接层和激活函数ReLU串起来,并对每个激活函数的输出使用丢弃法。我们可以分别设置各个层的丢弃概率。通常的建议是把靠近输入层的丢弃概率设得小一点。在这个实验中,我们把第一个隐藏层的丢弃概率设为0.2,把第二个隐藏层的丢弃概率设为0.5。我们可以通过参数is_training来判断运行模式为训练还是测试,并只需在训练模式下使用丢弃法。


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


模型评估的evaluate_accuracy函数:


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这个参数
                # 将is_training设置成False
                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


1.2.3 训练和测试模型


这部分与之前多层感知机的训练和测试类似。


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)


输出:


epoch 1, loss 0.0044, train acc 0.574, test acc 0.648
epoch 2, loss 0.0023, train acc 0.786, test acc 0.786
epoch 3, loss 0.0019, train acc 0.826, test acc 0.825
epoch 4, loss 0.0017, train acc 0.839, test acc 0.831
epoch 5, loss 0.0016, train acc 0.849, test acc 0.850


1.3 Dropout在Pytorch中的简洁实现


在PyTorch中,我们只需要在全连接层后添加Dropout层并指定丢弃概率。在训练模型时,Dropout层将以指定的丢弃概率随机丢弃上一层的输出元素;在测试模型时(即model.eval()后),Dropout层并不发挥作用。


net = nn.Sequential(
        d2l.FlattenLayer(),
        nn.Linear(num_inputs, num_hiddens1),
        nn.ReLU(),
        nn.Dropout(drop_prob1),
        nn.Linear(num_hiddens1, num_hiddens2), 
        nn.ReLU(),
        nn.Dropout(drop_prob2),
        nn.Linear(num_hiddens2, 10)
        )

for param in net.parameters():
    nn.init.normal_(param, mean=0, std=0.01)


下面训练并测试模型。

optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)


输出:

epoch 1, loss 0.0045, train acc 0.553, test acc 0.715
epoch 2, loss 0.0023, train acc 0.784, test acc 0.793
epoch 3, loss 0.0019, train acc 0.822, test acc 0.817
epoch 4, loss 0.0018, train acc 0.837, test acc 0.830
epoch 5, loss 0.0016, train acc 0.848, test acc 0.839


总结


  • 我们可以通过使用丢弃法应对过拟合。
  • 丢弃法只在训练模型时使用,在进行模型评估时不使用。

版权声明:本文内容由便宜云服务器实名注册用户自发贡献,版权归原作者所有,便宜云服务器开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《便宜云服务器开发者社区用户服务协议》和《便宜云服务器开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
深度学习相关概念:过拟合与欠拟合
是指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测的很好,但对未知数据预测得很差的现象。这种情况下模型可能只是记住了训练集数据,而不是学习到了数据特征。
32 0
# 【深度学习】:《100天一起学习PyTorch》模型评估和选择(上):欠拟合和过拟合
机器学习的任务是发现一种泛化的模式,通过训练集发现总体的规律,从而在未知的数据集上也能展现较好的精度。但是如何判断我们的模型不是单纯的记住了数据,而是真的发现了一种规律呢?因为,我们往往只能从有限样本集训练模型,当收集更多的数据时,会发现这些数据的预测结果和之前的关系完全不同。下面我们介绍一些机器学习评估模型的一些基本概念。
120 0
使用深度学习的方法进行人脸解锁(下)
使用深度学习的方法进行人脸解锁
43 0
使用深度学习的方法进行人脸解锁(上)
使用深度学习的方法进行人脸解锁
39 0
使用深度学习模型创作动漫故事,比较LSTM和GPT2的文本生成方法(下)
使用深度学习模型创作动漫故事,比较LSTM和GPT2的文本生成方法
116 0
使用深度学习模型创作动漫故事,比较LSTM和GPT2的文本生成方法(上)
使用深度学习模型创作动漫故事,比较LSTM和GPT2的文本生成方法
60 0
深度学习模型压缩方法的特点总结和对比
深度学习模型压缩方法的特点总结和对比
62 0
【从零开始学习深度学习】13. 防止过拟合方法:权重衰减(L2惩罚项)介绍及示例演示
【从零开始学习深度学习】13. 防止过拟合方法:权重衰减(L2惩罚项)介绍及示例演示
57 0
【从零开始学习深度学习】12. 什么是模型的训练误差?基于三阶多项式的欠拟合与过拟合训练过程演示
【从零开始学习深度学习】12. 什么是模型的训练误差?基于三阶多项式的欠拟合与过拟合训练过程演示
28038 0
深度学习篇之数据集划分方法-附代码python详细注释
深度学习篇之数据集划分方法-附代码python详细注释
267 0
+关注
阿旭算法与机器学习
专注于python、算法、机器学习及深度学习等相关技术分享,欢迎关注,共同学习交流。
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
深度学习在电商搜索和聊天机器人中的应用
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载


http://www.vxiaotou.com