我试图使用Pytorch(并使用具有一个隐藏层的神经网络)运行逻辑回归算法,但我偶然发现了一个问题。我正在为两个不同的输入数据运行相同的算法。我的输入是二维的。我创建的第一组数据是我自己创建的,而第二组数据来自我从csv文件中获得的真实数据,先转换为列表,然后转换为pytorch张量。
对于第一个输入数据,我在逻辑回归代码中插入的张量为:
First tensor has rank
torch.Size([1000, 2])
and it's given by:
T1= tensor([[ 0.6258, 0.9683],
[-0.0833, 0.5691],
[-0.4657, -0.8722],
...,
[ 0.5868, -1.0565],
[ 0.1611, -0.1716],
[-0.1515, -0.8408]])
第二组数据的张量为:
Second tensor has rank
torch.Size([1064, 2])
and it's given by:
T2= tensor([[918.0600, 74.8220],
[917.3477, 71.4038],
[923.0400, 60.6380],
...,
[916.6000, 71.0960],
[912.6000, 58.4060],
[921.5300, 77.7020]])
因此,正如您所看到的,该算法在reb / blue决策区域中做得相当不错,因为大多数红色点最终都在红色区域中(与蓝色区域相同)。
现在,对于第二组数据,我得到以下信息:
如您所见,它将整个区域绘制为红色。我尝试了一下隐藏层中神经元的数量,学习率,历元数和其他一些东西,但是似乎没有任何效果。然后,我认为这可能与x轴数据的值比y轴数据大得多有关,因此我通过将它们除以均值来对其进行归一化,但这并不能解决问题。
算法是相同的,但是它不适用于这组数据。我想知道,比我更专业的人是否可以对这里可能发生的问题有预感。
答案 0 :(得分:1)
当您不对数据进行标准化时,可以很容易地愚弄模型。
您的火车组由1000个示例组成,从外观上看,大多数值都在[-1, 1]
范围内。
但是,当您测试模型时,您将获得更高的数字。
解决方案是规范化。标准化输入后,您的模型可以自由地学习数据的真实分布函数,而不必“记忆”数字。
您应该对训练集和测试集进行归一化。这样您的值将在0到1之间,并且您的网络将有更好的机会获得所需的相关性。
import torch
import torch.nn.functional as f
train = torch.rand((4, 2))*100
tensor([[36.9267, 7.3306],
[63.5794, 42.9968],
[61.3316, 67.6096],
[88.4657, 11.7254]])
f.normalize(train, p=2, dim=1)
tensor([[0.9809, 0.1947],
[0.8284, 0.5602],
[0.6719, 0.7407],
[0.9913, 0.1314]])