Очень простой учебный цикл optim.SGD не работает должным образом - PyTorch - PullRequest
0 голосов
/ 07 ноября 2019

Я читал документацию по 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, и я ценю любую помощь!

1 Ответ

0 голосов
/ 07 ноября 2019

Используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...