0

我一直在阅读 PyTorch 文档,并且一直在尝试找出 MSELoss 和 autograd。我尝试创建一个非常简单的训练循环,该循环采用两个随机张量并更新每个张量中的值,以便将所有值tensor1的总和加上所有值的总和加上tensor2某个目标数。在我的示例中,我使用了 100。以下是我的实现方式:

import torch.nn as nn
import torch
import torch.optim as optim

loss = nn.MSELoss()
tensor1 = torch.randn(3, 5, requires_grad=True)
tensor2 = torch.randn(3, 5, requires_grad=True)
target_sum = torch.FloatTensor(torch.Tensor([100]))
optimizer = optim.SGD([nn.Parameter(tensor1), nn.Parameter(tensor2)], lr=1e-4)
print(str(tensor1.sum().item()) + str(tensor2.sum().item()))
for i in range(100):
    pred = tensor1.sum() + tensor2.sum()
    optimizer.zero_grad()
    loss(pred, target_sum).backward
    optimizer.step()
print(str(tensor1.sum().item()) + str(tensor2.sum().item()))

训练循环之前和训练循环之后的张量总和是相同的,但我应该看到总和增加并接近 100。我不确定我在这里缺少什么。我认为这可能与我的优化器有关,因为训练循环几乎直接来自文档示例。我是 PyTorch 的新手,感谢任何帮助!

4

1 回答 1

0

使用 abs(pred - target_sum) 计算losssincepredtarget_sum是标量。此外,删除nn.Parameter()优化定义中的包装器。这就是我所做的。

In [22]: import torch.nn as nn 
    ...: import torch 
    ...: import torch.optim as optim 
    ...:  
    ...: tensor1 = torch.randn(3, 5, requires_grad=True) 
    ...: tensor2 = torch.randn(3, 5, requires_grad=True) 
    ...: target_sum = 100 
    ...: optimizer = optim.SGD([tensor1, tensor2], lr=1e-2) 
    ...: print(tensor1.sum().item() + tensor2.sum().item()) 
    ...: for i in range(1000): 
    ...:     pred = tensor1.sum() + tensor2.sum() 
    ...:     optimizer.zero_grad() 
    ...:     loss = abs((pred-target_sum)) 
    ...:     loss.backward() 
    ...:     optimizer.step() 
    ...: print(tensor1.sum().item()+ tensor2.sum().item())

这个循环前后的结果如下

-0.777163028717041
100.02290725708008
于 2019-11-07T04:39:24.903 回答