《动手学深度学习 Pytorch版》 4.6 暂退法

2023-10-27

import torch
from torch import nn
from d2l import torch as d2l

4.6.1 重新审视过拟合

整节理论,详见书本。

4.6.2 扰动的稳健性

整节理论,详见书本。

4.6.3 实践中的暂退法

整节理论,详见书本。

4.6.4 从零开始实现

def dropout_layer(X, dropout):
    assert 0 <= dropout <= 1
    # 在本情况中,所有元素都被丢弃
    if dropout == 1:
        return torch.zeros_like(X)
    # 在本情况中,所有元素都被保留
    if dropout == 0:
        return X
    mask = (torch.rand(X.shape) > dropout).float()  # 从均匀分布U[0,1]中抽取与神经网络同维度的样本,保留大于 dropout 的样本
    return mask * X / (1.0 - dropout)
X= torch.arange(16, dtype = torch.float32).reshape((2, 8))
print(X)
print(dropout_layer(X, 0.))
print(dropout_layer(X, 0.5))
print(dropout_layer(X, 1.))
tensor([[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11., 12., 13., 14., 15.]])
tensor([[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11., 12., 13., 14., 15.]])
tensor([[ 0.,  0.,  0.,  6.,  0., 10., 12.,  0.],
        [16.,  0.,  0.,  0., 24., 26.,  0.,  0.]])
tensor([[0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0.]])
  1. 定义模型参数
num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 256
  1. 定义模型

    将暂退法应用于激活函数之后每个隐藏层的输出,常见的技巧是在靠近输入层的地方设置较低的暂退概率

dropout1, dropout2 = 0.2, 0.5  # 将第一个和第二个隐藏层的暂退概率分别设置为 0.2 和 0.5

class Net(nn.Module):
    def __init__(self, num_inputs, num_outputs, num_hiddens1, num_hiddens2,
                 is_training = True):
        super(Net, self).__init__()
        self.num_inputs = num_inputs
        self.training = is_training
        self.lin1 = nn.Linear(num_inputs, num_hiddens1)
        self.lin2 = nn.Linear(num_hiddens1, num_hiddens2)
        self.lin3 = nn.Linear(num_hiddens2, num_outputs)
        self.relu = nn.ReLU()

    def forward(self, X):
        H1 = self.relu(self.lin1(X.reshape((-1, self.num_inputs))))
        # 只有在训练模型时才使用dropout
        if self.training == True:
            # 在第一个全连接层之后添加一个dropout层
            H1 = dropout_layer(H1, dropout1)
        H2 = self.relu(self.lin2(H1))
        if self.training == True:
            # 在第二个全连接层之后添加一个dropout层
            H2 = dropout_layer(H2, dropout2)
        out = self.lin3(H2)
        return out


net = Net(num_inputs, num_outputs, num_hiddens1, num_hiddens2)
  1. 训练和测试
num_epochs, lr, batch_size = 10, 0.5, 256
loss = nn.CrossEntropyLoss(reduction='none')
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
trainer = torch.optim.SGD(net.parameters(), lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)


在这里插入图片描述

4.6.5 简洁实现

net = nn.Sequential(nn.Flatten(),
        nn.Linear(784, 256),
        nn.ReLU(),
        # 在第一个全连接层之后添加一个dropout层
        nn.Dropout(dropout1),
        nn.Linear(256, 256),
        nn.ReLU(),
        # 在第二个全连接层之后添加一个dropout层
        nn.Dropout(dropout2),
        nn.Linear(256, 10))

def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)

net.apply(init_weights)
Sequential(
  (0): Flatten(start_dim=1, end_dim=-1)
  (1): Linear(in_features=784, out_features=256, bias=True)
  (2): ReLU()
  (3): Dropout(p=0.2, inplace=False)
  (4): Linear(in_features=256, out_features=256, bias=True)
  (5): ReLU()
  (6): Dropout(p=0.5, inplace=False)
  (7): Linear(in_features=256, out_features=10, bias=True)
)
trainer = torch.optim.SGD(net.parameters(), lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)


在这里插入图片描述

练习

def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)

num_epochs, lr, batch_size = 10, 0.5, 256
loss = nn.CrossEntropyLoss(reduction='none')
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

(1)如果更改第一层和第二层的暂退概率,会出现什么情况?具体说说,如果交换这两个层会出现什么问题?设计一个实验来回答这些问题,定量描述该结果,并总结定性的结论。

for dropouts in [(0.1, 0.5), (0.1, 0.6), (0.2, 0.5), (0.2, 0.6), (0.5, 0.2)]:
    net0 = nn.Sequential(nn.Flatten(),
            nn.Linear(784, 256),
            nn.ReLU(),
            nn.Dropout(dropouts[0]),
            nn.Linear(256, 256),
            nn.ReLU(),
            nn.Dropout(dropouts[1]),
            nn.Linear(256, 10))

    net0.apply(init_weights)

    trainer0 = torch.optim.SGD(net0.parameters(), lr=lr)
    d2l.train_ch3(net0, train_iter, test_iter, loss, num_epochs, trainer0)


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

虽然区别不大,但确实是靠近输入层的暂退概率低一点好些。


(2)增加训练轮数,并将使用暂退法和不使用暂退法时获得的结果进行比较。

num_epochs1, lr, batch_size = 15, 0.5, 256

net1 = nn.Sequential(nn.Flatten(),
        nn.Linear(784, 256),
        nn.ReLU(),
        nn.Dropout(0.2),
        nn.Linear(256, 256),
        nn.ReLU(),
        nn.Dropout(0.5),
        nn.Linear(256, 10))

net2 = nn.Sequential(nn.Flatten(),
        nn.Linear(784, 256),
        nn.ReLU(),
        nn.Linear(256, 256),
        nn.ReLU(),
        nn.Linear(256, 10))

net1.apply(init_weights)
net2.apply(init_weights)

trainer1 = torch.optim.SGD(net1.parameters(), lr=lr)
d2l.train_ch3(net1, train_iter, test_iter, loss, num_epochs1, trainer1)


在这里插入图片描述

trainer2 = torch.optim.SGD(net2.parameters(), lr=lr)
d2l.train_ch3(net2, train_iter, test_iter, loss, num_epochs1, trainer2)


在这里插入图片描述

用暂退法确实能缓解过拟合现象。


(3)当使用或不使用暂退法时,每个隐藏层中激活值的方差是多少?绘制一个曲线图,以展现这两个模型的每个隐藏层中的激活值的方差是如何随时间变化的。

不会画,略 。


(4)为什么测试时通常不使用暂退法?

使用暂退法是为了减少训练过程中的过拟合现象,测试的目的并非为了训练,而是要一个结果,网络已经固定,当然无须使用暂退法。


(5)以本节中的模型为例,比较使用暂退法和权重衰减的效果。如果同时使用暂退法和权重衰减,会出现什么情况?结果是累加的吗?收益是否减少(或更糟)?它们互相抵消了吗?

不会,略。


(6)如果我们将暂退法应用到权重矩阵的各个权重,而不是激活值,会发生什么?

net3 = nn.Sequential(nn.Flatten(),
        nn.Linear(784, 256),
        nn.Dropout(0.2),
        nn.ReLU(),
        nn.Linear(256, 256),
        nn.Dropout(0.5),
        nn.ReLU(),
        nn.Linear(256, 10))

net3.apply(init_weights)
trainer3 = torch.optim.SGD(net3.parameters(), lr=lr)
d2l.train_ch3(net3, train_iter, test_iter, loss, num_epochs, trainer3)


在这里插入图片描述

目测没什么差别


(7)开发一种用于在每一层注入噪声的技术,该技术不同于标准的暂退法技术。尝试开发一种在 Fashion-MINIST 数据集(对于固定架构)上性能优于暂退法的方法。

不会,略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《动手学深度学习 Pytorch版》 4.6 暂退法 的相关文章

随机推荐

  • C++STL库神器:nth_element() 详解

    nth element nth element 函数头文件 algorithm h 功能介绍 arr n 默认求第m大的元素 std nth element arr arr m arr n 定义cmp可求第m小的元素 bool cmp in
  • 单台服务器docker如何搭建rabbitmq集群

    文章目录 一 创建多个RabbitMQ容器 二 将RabbitMQ节点加入到集群中 三 测试 四 在多台服务器上部署RabbitMQ集群 五 通过nginx实现负载均衡 六 如何给RabbitMQ容器添加用户 七 碰到的问题 1 本文是在同
  • Altium AD20过孔盖油,通过设计规则实现过孔盖油,简便实用不会造成遗漏出错

    如果是将PCB源文件发给加工厂 只需说明过孔盖油 板厂就会帮你完成对应的操作 但为了避免源文件泄露 会选择Gerber文件 这时候过孔盖油就要自己来做了 如果没有对规则进行设置 那么切换到Solder层 默认的视图应该是这样的 过孔的周围多
  • Nginx 概述 如何正规安装 静态网页配置 反向代理配置 负载均衡配置

    目录 1 基本概念 1 1 Nginx初步认识 1 2 正向 反向代理 1 3 域名和IP 2 Nginx安装和配置 2 1 安装Nginx 2 2 配置 3 Nginx的使用 3 1 部署静态网页 3 2 反向代理和负载均衡 1 反向代理
  • Python基础知识

    目录 前言 一 Python虚拟环境 1 Python虚拟环境的意义 2 Python构造虚拟环境的方法 3 Python虚拟环境问题处理 二 Python其他知识点 1 pip忽略缓存安装 2 镜像源 3 python查找项目依赖 4 p
  • 谷歌翻译API-python接口-Googletrans

    Googletrans是一个免费且无限制的python库 可实现Google Translate API Google Translate交互式API可以用来调用诸如自动侦测语言种类和翻译之类的用途 英文网址 https py google
  • 用python画星空的代码简单,python星空浪漫表白源码

    大家好 给大家分享一下用python画星空的代码简单 很多人还不知道这一点 下面详细解释一下 现在让我们来看看 用python画星空源代码是什么 用python画星空源代码是from turtle import from random im
  • 计算机主机采用的电子器件发展顺序,计算机采用的主机电子器件的发展顺序是什么?...

    计算机采用的主机电子器件的发展顺序是 电子管 晶体管 中小规模集成电路 大规模和超大规模集成电路 按照计算机采用的电子器件不同将计算机划分为电子管 晶体管 中小规模集成电路 大规模和超大规模集成电路四代 计算机采用的主机电子器件的发展顺序是
  • 海神祭司被机器人拉出来_那一抹勾魂的蓝色,卡西欧海神Oceanus 系列介绍

    本内容来源于 什么值得买APP 观点仅代表作者本人 作者 木木滚滚 先前写的卡西欧G shock系列介绍的文章下面 有挺多老哥说想要看卡西欧海神的介绍文章 于是说写就写 也开启一个新的专栏系列文章 希望能坚持写下去 一 卡西欧手表的分类 我
  • 使用lightdm启动dwm或桌面

    简介 LightDM 是一个跨桌面环境的显示管理器 它的特点有 跨桌面 支持不同的桌面环境 支持多种显示技术 X Wayland 轻量级 低内存使用 高性能 支持定制会话 支持远程登录 XDMCP VNC XDMCP 可插拔 完善的测试组件
  • Unity中的一些问题

    Unity代码编写标准流程 1 建议按照执行流程写代码 这样减少忘记写功能的可能性 2 复杂的类型的初始化赋值 不要在初始化中赋值 应该设为private 因为不用在窗口中赋值 所以在start 中初始化 常规问题 一些Unit bug 脚
  • 《Code_Complete_2》持续更新中......

    如何阅读这本书 这本书有意设计成使你既可以从头到尾阅读 也可以按主题阅读 1 如果你想从头到尾阅读 那么你可以直接从第2章 用隐喻来更充分地理解软件开发 开始钻研 2 如果你想学习特定的编程技巧 那么你可以从第6章 可以工作的类 开始 然后
  • 为什么美国程序员工作比中国程序员工作轻松、加班少?

    作者 LJ说 责编 伍杏玲 本文经授权转载自LJ说 ID LjNotes 先问是不是 再问为什么 难道美国的程序员就不加班吗 他们就一天八小时工作 还想来就来 想走就走 非工作时间完全找不到人 还有什么食物饮料都免费提供 让我来告诉你真实的
  • webpack

    看一下完整报错 asset static js index js 4 04 KiB compared for emit name main src main js 39 bytes not cacheable built code gene
  • 基于Neptune开发板的键盘蓝牙模块DIY指南

    本期我们带来基于润和Neptune开发板 以下简称Neptune开发板 的键盘蓝牙模块DIY指南 利用Neptune开发板支持串口和蓝牙功能等特性 将有线键盘改造成蓝牙键盘 实现一个键盘被多操作系统 终端设备识别使用的功能 达到提高工作效率
  • C++ 检测内存泄露工具 -- Windows平台

    平台 Windows7 64bit 编译器G mingw 工具 Dr Memory 项目主页 https code google com p drmemory 可能要FQ 可能会很慢 所以 可以直接按照下面官方主页给出的链接下载 我也放了一
  • 人工智能应用实例:图片降噪

    人工智能应用实例 图片降噪 场景设置 对白色背景 黑色前景的黑白图片进行降噪处理 可以假定背景部分多于前景 图1 从左往右 原图 噪声图 降噪图 降噪模型 我们可以对图片建立这样一个两层的二维模型 底层表示原图 顶层表示任意的噪声图 xi为
  • Power BI 数据模型设计及搭建——星型模型&雪花模型

    前言 之前的笔记提到了 Power BI 数据模型的核心概念 本文继续深入讨论数据模型的设计架构 同时介绍两种常用的数据模型 星型模型和雪花模型 BI 的数据模型和数仓模型有什么不同 数据仓库和Power BI中使用的数据架构模型有一些相似
  • 创建SpringBoot项目时修改Server URL(下载路径)

    使用spring initializr创建Springboot项目时 IDEA默认的Server URL为 https start spring io 使用该下载路径缺点 1 从中央仓库进行下载 下载速度慢 2 当网络不稳定时 或网络访问限
  • 《动手学深度学习 Pytorch版》 4.6 暂退法

    import torch from torch import nn from d2l import torch as d2l 4 6 1 重新审视过拟合 整节理论 详见书本 4 6 2 扰动的稳健性 整节理论 详见书本 4 6 3 实践中的