PyTorch 中带有 dropout 正则化的逻辑回归
Posted
技术标签:
【中文标题】PyTorch 中带有 dropout 正则化的逻辑回归【英文标题】:Logistic regression with dropout regularization in PyTorch 【发布时间】:2021-11-10 12:39:03 【问题描述】:我想使用 dropout 正则化实现逻辑回归,但目前唯一可行的示例如下:
class logit(nn.Module):
def __init__(self, input_dim = 69, output_dim = 1):
super(logit, self).__init__()
# Input Layer (69) -> 1
self.fc1 = nn.Linear(input_dim, input_dim)
self.fc2 = nn.Linear(input_dim, 1)
self.dp = nn.Dropout(p = 0.2)
# Feed Forward Function
def forward(self, x):
x = self.fc1(x)
x = self.dp(x)
x = torch.sigmoid(self.fc2(x))
return x
现在在层之间设置 dropout 的问题是,最后我不再有逻辑回归(如果我错了,请纠正我)。
我想做的是在输入级别退出。
【问题讨论】:
【参考方案1】:实际上,你仍然有一个逻辑回归,而 dropout 保持原样。
fc1
和 fc2
之间的 dropout 将丢弃fc1
产生的一些input_dim
功能(与p=0.2
),要求fc2
对它们的缺失保持稳健。这个事实不会改变模型输出的 logit。此外,请记住,在测试时,(通常)会禁用 dropout。
请注意,您也可以在输入级别应用 dropout:
def forward(self, x):
x = self.dp(x)
x = self.fc1(x)
x = self.dp(x)
x = torch.sigmoid(self.fc2(x))
在这种情况下,fc1
必须对某些输入特征的缺失具有鲁棒性。
【讨论】:
很好的回应!但是nn.linear()
会不会和下一层建立全套连接?让我改写一下,我能否将我的模型方程写为 1/(1+ exp(-(beta*x))) 其中当然我的 beta 是来自model.parameters()
的最后一个张量的元素?
@MarcoRepetto 是的,你会的。发生的情况是,在训练时,一些 xs 将被 dropout 清零(相当于从前一层中删除一个神经元),但所有连接仍然存在,因为 dropout 不是确定性的,并且所有这些权重都需要在测试时(即使您在测试时应用 dropout,这是不寻常的)。以上是关于PyTorch 中带有 dropout 正则化的逻辑回归的主要内容,如果未能解决你的问题,请参考以下文章
正则化之L1和L2已经dropout的一些理解和pytorch代码实现与效果证明