【发布时间】: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=)我真的迷路了。这不可行吗?
【问题讨论】:
-
你能在训练函数之外初始化你的损失和优化器吗?
-
我做了同样的结果。
标签: pytorch artificial-intelligence reinforcement-learning