一、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放在全连接层之后,激活函数之前是更常见的做法。
784

被折叠的 条评论
为什么被折叠?



