首页 > 解决方案 > 在 Pytorch 中使用逻辑回归的预测返回无穷大

问题描述

我开始观看有关 PyTorch 的教程,并且正在学习逻辑回归的概念。

我使用我拥有的一些股票数据进行了尝试。我有inputs,其中包含两个参数trade_quantitytrade_valuetargets其中有对应的股票价格。

inputs = torch.tensor([[182723838.00, 2375432.00],
                       [185968153.00, 2415558.00],
                       [181970093.00, 2369140.00],
                       [221676832.00, 2811589.00],
                       [339785916.00, 4291782.00],
                       [225855390.00, 2821301.00],
                       [151430199.00, 1889032.00],
                       [122645372.00, 1552998.00],
                       [129015052.00, 1617158.00],
                       [121207837.00, 1532166.00],
                       [139554705.00, 1789392.00]])

targets = torch.tensor([[76.90],
                        [76.90],
                        [76.90],
                        [80.70],
                        [78.95],
                        [79.60],
                        [80.05],
                        [78.90],
                        [79.40],
                        [78.95],
                        [77.80]])

我定义了模型函数,损失为均方误差,并尝试运行它几次以获得一些预测。这是代码:

def model(x):
    return x @ w.t() + b

def mse(t1, t2):
    diff = t1 - t2
    return torch.sum(diff * diff) / diff.numel()

preds = model(inputs)
loss = mse(preds, targets)
loss.backward()
with torch.no_grad():
    w -= w.grad * 1e-5
    b -= b.grad * 1e-5
    w.grad.zero_()
    b.grad.zero_()

我为此使用 Jupyter 并运行了代码的最后一部分几次,之后预测如下:

tensor([[inf],
        [inf],
        [inf],
        [inf],
        [inf],
        [inf],
        [inf],
        [inf],
        [inf],
        [inf],
        [inf]], grad_fn=<AddBackward0>)

如果我再运行几次,预测将变为nan. 你能告诉我为什么会这样吗?

标签: pytorch

解决方案


对我来说,这看起来更像是线性回归而不是逻辑回归。您正在尝试将线性模型拟合到您的数据中。它与二进制分类任务不同,您需要使用一种特殊类型的激活函数(例如sigmoid),以便输出为01

在这个特定的例子中,你想解决一个二维线性问题,给定输入x的形状(batch, x1, x2)x1trade_quantityx2trade_value)和目标(batch, y)ystock_price)。

因此,目标是找到最佳矩阵(权重矩阵和偏差列),以便w根据您的标准尽可能接近均方误差。bx@w + by


我建议标准化您的数据,使其保持在一个[0, 1]范围内。您可以通过测量 和 的均值标准来做到这一点。inputstargets

inputs_min, inputs_max = inputs.min(axis=0).values, inputs.max(axis=0).values
targets_min, targets_max = targets.min(axis=0).values, targets.max(axis=0).values

然后应用转换:

x = (inputs - inputs_min)/(inputs_max - inputs_min)
y = (targets - targets_min)/(targets_max - targets_min)

尝试改变你的学习率并让它运行多个 epoch。

lr = 1e-2
for epochs in range(100):
    preds = model(x)
    loss = mse(preds, y)
    loss.backward()
    with torch.no_grad():
        w -= lr*w.grad
        b -= lr*b.grad
        w.grad.zero_()
        b.grad.zero_()

我使用一个(1, 2)随机初始化的矩阵w(和一个(1,)矩阵b):

w = torch.rand(1, 2)
w.requires_grad = True
b = torch.rand(1)
b.requires_grad = True

并在100 个epoch内得到以下火车损失:

在此处输入图像描述

要找到正确的超参数,最好有一个验证集。该集合将使用训练集中的均值标准值进行归一化。它将用于在每个 epoch 结束时评估模型“未知”的数据的性能。如果你有一个,你的测试集也是如此。


推荐阅读