【发布时间】:2017-11-26 20:41:25
【问题描述】:
我正在用 pytorch 试验一个简单的 2 层神经网络,只输入三个大小为 10 的输入,一个值作为输出。我已经标准化了输入并降低了学习率。据我了解,两层全连接神经网络应该能够轻松适应这些数据
Features:
0.8138 1.2342 0.4419 0.8273 0.0728 2.4576 0.3800 0.0512 0.6872 0.5201
1.5666 1.3955 1.0436 0.1602 0.1688 0.2074 0.8810 0.9155 0.9641 1.3668
1.7091 0.9091 0.5058 0.6149 0.3669 0.1365 0.3442 0.9482 1.2550 1.6950
[torch.FloatTensor of size 3x10]
Targets
[124, 125, 122]
[torch.FloatTensor of size 3]
代码改编自一个简单的示例,我使用 MSELoss 作为损失函数。只需几次迭代,损失就会发散到无穷大:
features = torch.from_numpy(np.array(features))
x_data = Variable(torch.Tensor(features))
y_data = Variable(torch.Tensor(targets))
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear = torch.nn.Linear(10,5)
self.linear2 = torch.nn.Linear(5,1)
def forward(self, x):
l_out1 = self.linear(x)
y_pred = self.linear2(l_out1)
return y_pred
model = Model()
criterion = torch.nn.MSELoss(size_average = False)
optim = torch.optim.SGD(model.parameters(), lr = 0.001)
def main():
for iteration in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(iteration, loss.data[0])
optim.zero_grad()
loss.backward()
optim.step()
任何帮助将不胜感激。谢谢
编辑:
确实,这似乎只是因为learning rate 太高了。设置为 0.00001 可以解决收敛问题,尽管收敛速度很慢。
【问题讨论】:
-
在运行梯度下降之前对特征进行归一化可能是个好主意。归一化提供更快的收敛(通常),并且由于每次迭代的梯度基于特征的大小,这将允许您提高学习率。请注意,在测试时,您需要以与训练集相同的方式对测试数据集的特征进行标准化。
-
嗨 raryeng,这些特征实际上已经以减去均值和除以标准差的标准方式进行了归一化。原始数据分布在 0 到大约 10,000 之间。
标签: python machine-learning neural-network pytorch