dropout方法pytorch版本代码实现

一、原理介绍

(比权重衰退效果更好),在数据里面加入随机噪音。dropout是在层之间,加入噪音,

1.【方法如下】
E[x’]=x 保证期望不变,
p的概率下,取值改为0.
其他情况下:改为 x/(1-p)
dropout方法pytorch版本代码实现_第1张图片

2.【用法】
对隐藏层的输出h,做dropout,得到h’
常用于多层感知机(全连接层的隐藏层 )的隐藏层输出上,
丢弃概率,是一个超参数
【常用值有: 0.5 0.9 0.1】
dropout方法pytorch版本代码实现_第2张图片

3.【dropout只在训练中用】
dropout是一个正则项,正则项只在训练过程中用,正则项只会对权重产生影响,
在预测中,是不需要正则的,是不会用到dropout的,保证确定性的输出
正则项作用:在更新模型权重时, 降低模型复杂度

4.【可重复性如何实现?】
固定随机种子,禁掉cudnn(cudnn出来的结果随机性很大,矩阵求和先后顺序不同,会导致值不同,因为精度会被影响)

二、代码实现

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

# assert condition
# 用来让程序测试这个condition,如果condition为false,那么raise一个AssertionError出来

# float()
# 布尔型转换为浮点数
# Float(true)
# 运行结果:1.0
# Float(false)
# 运行结果:0.0

def dropout_layer(X, dropout):
    assert 0 <= dropout <= 1
    # 在本情况中,所有元素都被丢弃
    if dropout == 1:
        return torch.zeros_like(X)
    # 在本情况中,所有元素都被保留
    if dropout == 0:
        return X
    mask = (torch.randn(X.shape) > dropout).float()
    return mask * X / (1.0 - dropout)
# 为社么这里用了乘法*,而不是直接选择呢
# 是因为这样效率更高,对GPU好

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.))

# 每次运行的时候调用 随机生成数,使得每次被置为0的是不一样的
#  如果每次是固定的,就等价于把隐藏层大小变小了

三、排错

RuntimeError: DataLoader worker (pid(s) 9764, 15128) exited unexpectedly

num_workers是加载数据(batch)的线程数目

当加载batch的时间 < 数据训练的时间

GPU每次训练完都可以直接从CPU中取到next batch的数据

无需额外的等待,因此也不需要多余的worker,即使增加worker也不会影响训练速度

当加载batch的时间 > 数据训练的时间

GPU每次训练完都需要等待CPU完成数据的载入

若增加worker,即使worker_1还未就绪,GPU也可以取worker_2的数据来训练

仅限单线程训练情况

设置num_works和batchsize

https://www.cnblogs.com/longyi8013/p/14880432.html
https://blog.csdn.net/qq_41917697/article/details/114663331
https://www.cnblogs.com/hesse-summer/p/11343870.html

你可能感兴趣的:(深度学习,python,机器学习,深度学习)