逻辑回归模型不起作用

问题描述 投票:0回答:1
class Logistic(nn.Module):
    def __init__(self):
        super(Logistic, self).__init__()
        self.layer = nn.Linear(1, 1)

    def forward(self, x):
        return self.layer(x)

model_0 = Logistic() 

lossFunction = nn.BCEWithLogitsLoss() 
optimizer = torch.optim.Adam(params = model_0.parameters(), lr = 0.01)

for epoch in range(1000):
    yLogits = model_0(xTrain).squeeze()
    yPredicted = torch.round(torch.sigmoid(yLogits))
    loss = lossFunction(yLogits, yTrain) 
    accuracy = Accuracy(yPredicted, yTrain)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step() 

    if epoch % 100 == 0:
        print(f'epoch : {epoch}, loss: {loss}, accuracy: {accuracy}')

我的代码出了什么问题,它根本没有学习,只是猜测输出,而准确度始终是 50%,需要做些什么来提高我的准确度和预测概率。

输出:

epoch : 0, loss: 13418.1171875, accuracy: 52.0
epoch : 100, loss: 15.833349227905273, accuracy: 48.0
epoch : 200, loss: 13.117620468139648, accuracy: 48.0
epoch : 300, loss: 54.322288513183594, accuracy: 48.0
epoch : 400, loss: 81.71748352050781, accuracy: 48.0
epoch : 500, loss: 35.89091491699219, accuracy: 48.0
epoch : 600, loss: 35.788761138916016, accuracy: 48.0
epoch : 700, loss: 53.480674743652344, accuracy: 48.0
epoch : 800, loss: 111.3875503540039, accuracy: 52.0
epoch : 900, loss: 21.1838436126709, accuracy: 52.0

我尝试构建一个逻辑回归模型,该模型不预测输出,当损失函数为 BCEWithLogitsLoss()(准确度 = 52%)时,它只是返回全 0;当损失函数为 BCELoss()(准确度)时,它只返回全 1 = 48%)我需要做什么来提高我的准确性和预测概率。

python machine-learning pytorch logistic-regression
1个回答
0
投票

我可以看到您尚未将 sigmoid 激活函数应用于输出层。您通常将 Logistic 回归中的 sigmoid 激活函数应用于线性层的输出,以获得 0 到 1 之间的概率。因此,您需要按如下方式修改前向函数:

def forward(self, x):
    return torch.sigmoid(self.layer(x))

您可以尝试做的另一件事是将您的 BCELoss 替换为 BCEWithLogitsLoss,您可以在此处了解更多信息。根据文档:

此损失将 Sigmoid 层和 BCELoss 结合在一个类中。这个版本比使用简单的 Sigmoid 和 BCELoss 更稳定,因为通过将操作组合到一层,我们利用 log-sum-exp 技巧来实现数值稳定性。

您还可以尝试的另一件事是增加神经网络的大小。具有更多隐藏层或每层中更多神经元的更大神经网络可以捕获数据中更复杂的模式,但它也会增加过度拟合的机会。您还可以尝试更改学习率,您可以在here了解更多信息。不幸的是,没有一种解决方案适合神经网络的所有情况,因此通常需要进行实验来找到两者的适当平衡。

© www.soinside.com 2019 - 2024. All rights reserved.