Pytorch 简单线性 Sigmoid 网络不学习

Posted

技术标签:

【中文标题】Pytorch 简单线性 Sigmoid 网络不学习【英文标题】:Pytorch Simple Linear Sigmoid Network not learning 【发布时间】:2021-01-23 21:18:56 【问题描述】:

我正在学习 pytorch,并尝试将网络训练为 XOR 门。一切运行顺利,但它只是不学习。它确实改变了它的权重,但它会为每个超出预期结果的输入收敛到一个结果。

我尝试了许多学习率和权重初始化。

所以输入是 A 和 B 门,如果两者相等则返回 1,否则返回 0,如下所示:

[0,0] => 1 [0,1] => 0 [1,0] => 0 [1,1] => 1

这是我对模型进行建模和训练的尝试:

将火炬作为火炬导入 将 torch.nn 导入为 nn 类网络(nn.Module): def __init__(self): 超级(网络,自我).__init__() self.x1 = nn.Linear(2,4) self.s1 = nn.Sigmoid() self.x2 = nn.Linear(4,1) self.s2 = nn.Sigmoid() 定义初始化(自我): nn.init.uniform_(self.x1.weight) nn.init.uniform_(self.x2.weight) def forward(自我,壮举): f1 = torch.tensor(feats).float() xr1=self.x1(f1) xs1=self.s1(xr1) xr2=self.x2(xs1) out=self.s2(xr2) 返回 def train(self,val_expected,feats_next): val_expected_tensor = torch.tensor(val_expected) 标准 = nn.MSELoss() 优化器 = torch.optim.SGD(self.parameters(), lr=0.01) 定义关闭(): 优化器.zero_grad() resp = self.forward(feats_next) 错误=标准(resp,val_expected_tensor) error.backward() 返回错误 优化器.step(关闭) 净 = 网络() 网络初始化() 对于 ([0.,0.],[0.,1.],[1.,0.],[1.,1.]) 中的输入: 响应=net.forward(输入) 打印(响应) 打印(“--训练开始-”) 对于我在范围内(1000): net.train([1.],[0.,0.]) net.train([0.],[1.,0.]) net.train([0.],[0.,1.]) net.train([1.],[1.,1.]) 打印(“---火车结束---”) 对于 ([0.,0.],[0.,1.],[1.,0.],[1.,1.]) 中的输入: 响应=net.forward(输入) 打印(响应)

这是以 0.001 的学习率进行 100000 次迭代的运行:

张量([0.7726],grad_fn=) 张量([0.7954],grad_fn=) 张量([0.8229],grad_fn=) 张量([0.8410],grad_fn=) --训练开始- *.......*......*......*......*...... *.......*......*......*......*...... ---训练结束--- 张量([0.6311],grad_fn=) 张量([0.6459],grad_fn=) 张量([0.6770],grad_fn=) 张量([0.6906],grad_fn=)

我真的迷路了。这不可行吗?

【问题讨论】:

你能在训练函数之外初始化你的损失和优化器吗? 我做了同样的结果。 【参考方案1】:

因此,在您的情况下,请将 train 方法保留在网络类之外。代码如下。

net = Network()
net.init()
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)
for input in ([0., 0.], [0., 1.], [1., 0.], [1., 1.]):
    response = net.forward(input)
    print (response)

def train(val_expected, feats_next, criterion, optimizer):
    val_expected_tensor = torch.tensor(val_expected)
    optimizer.zero_grad()
    resp = net.forward(feats_next)
    # print (resp)
    error = criterion(resp, val_expected_tensor)
    # print (error, resp, val_expected_tensor)
    error.backward()
    # print (error)
    optimizer.step()


print("--TRAIN START-")
for i in range(10000):
    train([1.], [0., 0.], criterion, optimizer)
    train([0.], [1., 0.], criterion, optimizer)
    train([0.], [0., 1.], criterion, optimizer)
    train([1.], [1., 1.], criterion, optimizer)
print("---TRAIN END---")

for input in ([0., 0.], [0., 1.], [1., 0.], [1., 1.]):
    response = net.forward(input)
    print(response)

结果如下:

tensor([0.9571], grad_fn=<SigmoidBackward>)
tensor([0.0414], grad_fn=<SigmoidBackward>)
tensor([0.0459], grad_fn=<SigmoidBackward>)
tensor([0.9621], grad_fn=<SigmoidBackward>)

我只是提高了学习率,而且nn.Module 中有一个 train 方法,因此在模型实例化中使用 trainer 方法不是一个好主意。

【讨论】:

这实际上解决了它。我不明白为什么它在网络内部不起作用。但我可以忍受。非常感谢! 我认为post 会对您有所帮助。这是关于在模型类中调用 fit 函数。

以上是关于Pytorch 简单线性 Sigmoid 网络不学习的主要内容,如果未能解决你的问题,请参考以下文章

动手学习pytorch——多层感知机

Pytorch实现Logistic回归二分类

pytorch搭建简单神经网络

[深度学习][pytorch]pytorch实现一个简单得线性回归模型并训练

PyTorch基础教程7多维特征input(学不会来打我啊)

具有神经网络的线性系统中的 sigmoid() 或 tanh() 激活函数