nn.Dropout()

本文章已经生成可运行项目,

一、nn.Dropout 层处理

nn.Dropout 层的作用是在训练过程中随机丢弃(置零)输入的一部分,以防止过拟合。丢弃率(p)是指每个元素被丢弃的概率

丢弃:其实就是将元素设置为0

由于每个元素的丢弃率为p,因此总体接近丢弃率为p

实例:

import torch
import torch.nn as nn
import torch.nn.functional as F

# 定义一个简单的Sequential模型,Dropout放在全连接层之后
model = nn.Sequential(
    nn.Linear(10, 6),  # 第一个全连接层:输入特征为10,输出特征为6
    nn.Dropout(0.5),   # Dropout层,丢弃率为0.5

)

# 创建一些随机数据作为输入
inputs = torch.randn(1, 10)
print(f"inputs:{inputs}")
# 将数据通过模型进行前向传播
outputs = model(inputs)

# 查看输出结果
print(outputs)

输出:可以发现每次总体丢弃率接近0.5

但由于是每个元素被丢弃的概率因此第三次出现了四个0的情况,第四次出现了两个0的情况

#第一次运行

nputs:tensor([[ 0.6913, -0.2736,  1.0752,  1.1694, -0.0328, -0.2115, -0.8545, -1.2126,
          0.7258, -0.1025]])
tensor([[-0.0000, -0.0000,  0.0000, -2.9137,  0.5393,  0.9211]],
       grad_fn=<MulBackward0>)
 

#第二次运行

inputs:tensor([[-1.5821, -1.1117, -0.3902, -0.4015, -0.4621,  0.3118, -0.1840, -0.1361,
         -0.0334, -0.2531]])
tensor([[-0.9975,  0.2856, -0.3036,  0.0000,  0.0000,  0.0000]],
       grad_fn=<MulBackward0>)

#第三次运行

inputs:tensor([[-0.1219, -0.3327, -0.9559, -0.8372, -0.5769, -1.3096,  0.4118,  1.3500,
         -1.4452,  1.1366]])
tensor([[ 1.2032,  0.0000,  0.0000, -0.0000, -0.0000, -1.3880]],
       grad_fn=<MulBackward0>)

#第四次运行

inputs:tensor([[ 0.9308, -0.4583, -0.7396,  0.7248,  1.0627,  0.0341, -0.7925,  1.5907,
         -1.4953,  0.9772]])
tensor([[ 2.4407, -0.5204, -0.7563,  0.9997,  0.0000, -0.0000]],
       grad_fn=<MulBackward0>)

总的来说就是经过dropout层就把数据按照丢弃率p进行丢弃,然后再进行下一步操作。

二、nn.Dropout()放在连接层前后的区别

一中将nn.Dropout()放在连接层后发现经过全连接层之后特征(数值)一半为零。

二中将nn.Dropout()放在连接层前发现经过全连接层之后特征(数值)不为零,但是全连接层的输入数值一半为零。

实例:

import torch
import torch.nn as nn
import torch.nn.functional as F

# 定义一个简单的Sequential模型,Dropout放在全连接层之后
model = nn.Sequential(

    nn.Dropout(0.5),   # Dropout层,丢弃率为0.5
    nn.Linear(10, 6),  # 第一个全连接层:输入特征为10,输出特征为6
)

# 创建一些随机数据作为输入
inputs = torch.randn(1, 10)
print(f"inputs:{inputs}")
#先经过dropout层
test1=model[0]
print(test1(inputs))
# 将数据通过模型进行前向传播
outputs = model(inputs)

# 查看输出结果
print(outputs)

输出:

inputs:tensor([[-1.2183,  1.5232,  0.6325,  1.0188,  1.3822,  0.3304, -2.2144, -0.6342,
         -1.2998,  0.0908]])
tensor([[-0.0000,  0.0000,  1.2651,  2.0376,  0.0000,  0.6609, -0.0000, -1.2684,
         -0.0000,  0.1817]])
tensor([[-0.3961,  0.6381, -0.4007,  1.0270, -1.5493, -0.7777]],
       grad_fn=<AddmmBackward0>)
 

总结:放在前后的选择会带来不同的结果,将Dropout放在全连接层之后,激活函数之前是更常见的做法。

本文已生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值