zoukankan      html  css  js  c++  java
  • 深度学习之丢弃法——2020.2.29

           深度学习模型常常使⽤丢弃法(dropout)来应对过拟合问题。丢弃法有⼀些不同的变体。本节中提到的丢弃法特指倒置丢弃法(inverted dropout)。

    1. dropout 函数将以 drop_prob 的概率丢弃 X 中的元素。

    %matplotlib inline
    import torch
    import torch.nn as nn
    import numpy as np
    import sys
    sys.path.append("..")
    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)
        mask = (torch.randn(X.shape) < keep_prob).float()
        
        return mask * X / keep_prob
    

    2. 运⾏例⼦来测试⼀下 dropout 函数。其中丢弃概率分别为0、0.5和1。

    X = torch.arange(16).view(2, 8)
    dropout(X, 0)
    

           丢弃率为0.5

    dropout(X, 0.5)
    

           丢弃率为1.0

    dropout(X, 1.0)
    

    运行结果:

    3. 定义模型参数

    # 定义模型参数
    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. 定义模型

    # 定义模型
    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
    

           在对模型评估的时候不应该进⾏丢弃,所以我们修改⼀下 d2lzh_pytorch 中 的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这个参数
    

           需要restart kernel才有效。

    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)
    

           测试结果:

  • 相关阅读:
    Deep learning:二十五(Kmeans单层网络识别性能)
    Deep learning:三十六(关于构建深度卷积SAE网络的一点困惑)
    Matlab成长之路_5(解决out of memory问题)
    Deep learning:三(Multivariance Linear Regression练习)
    Deep learning:一(基础知识_1)
    Deep learning:三十二(基础知识_3)
    算法设计和数据结构学习_2(常见排序算法思想)
    Deep learning:二十七(Sparse coding中关于矩阵的范数求导)
    Deep learning:十二(PCA和whitening在二自然图像中的练习)
    总结系列_15(不能从u盘启动安装win7系统的一个小原因)
  • 原文地址:https://www.cnblogs.com/somedayLi/p/12386111.html
Copyright © 2011-2022 走看看