非常简单的 optim.SGD 训练循环没有按预期工作 - PyTorch
Very simple optim.SGD training loop not working as expected - PyTorch
我一直在通读 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 的新手,感谢任何帮助!
使用 abs(pred - target_sum) 计算 loss
因为 pred
和 target_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
我一直在通读 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 的新手,感谢任何帮助!
使用 abs(pred - target_sum) 计算 loss
因为 pred
和 target_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