Градиенты Pytorch существуют, но веса не обновляются - PullRequest
0 голосов
/ 29 июня 2018

Итак, у меня есть глубокая сверточная сеть со слоем lstm, и после слоя ltsm она разделяется, чтобы вычислить две разные функции (используя два разных линейных слоя), результаты которых затем складываются вместе, чтобы сформировать окончательный вывод сети.

Когда я вычисляю потерю сети, чтобы можно было рассчитать градиенты и обновить веса, я выполняю несколько операций, а затем вычисляю потери между производным значением и вычисленным целевым значением.

def update(output, target):
    # target output is calculated outside the function
    # operations on output
    loss(output, target).backward()
    self.optimizer.step()

Сеть имеет некоторые потери (иногда в очень небольшом порядке, но иногда и в более высоких порядках), например, некоторые потери:

tensor(1.00000e-04 *
   5.7420)
tensor(2.7190)
tensor(0.9684)

Он также имеет градиенты, рассчитанные здесь:

for param in self.parameters():
    print(param.grad.data.sum())

Какие выходы:

tensor(1.00000e-03 *
   1.9996)
tensor(1.00000e-03 *
   2.6101)
tensor(1.00000e-02 *
   -1.3879)
tensor(1.00000e-03 *
   -4.5834)
tensor(1.00000e-02 *
   2.1762)
tensor(1.00000e-03 *
   3.6246)
tensor(1.00000e-03 *
   6.6234)
tensor(1.00000e-02 *
   2.9373)
tensor(1.00000e-02 *
   1.2680)
tensor(1.00000e-03 *
   1.8791)
tensor(1.00000e-02 *
   1.7322)
tensor(1.00000e-02 *
   1.7322)
tensor(0.)
tensor(0.)
tensor(1.00000e-03 *
   -6.7885)
tensor(1.00000e-02 *
   9.7793)

И

tensor(2.4620)
tensor(0.9544)
tensor(-26.2465)
tensor(0.2280)
tensor(-219.2602)
tensor(-2.7870)
tensor(-50.8203)
tensor(3.2548)
tensor(19.6163)
tensor(-18.6029)
tensor(3.8564)
tensor(3.8564)
tensor(0.)
tensor(0.)
tensor(0.8040)
tensor(-0.1157)

Но когда я сравниваю вес до и после запуска оптимизатора, я получаю результат, что веса равны друг другу.

Код для проверки изменения веса:

before = list(neuralnet.parameters())
neuralnet.update()
after = list(neuralnet.parameters())
for i in range(len(before)):
    print(torch.equal(before[i].data, after[i].data))

Приведенное выше возвращает True для каждой итерации.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

При инициализации параметров оберните их в класс torch.nn.Parameter(), чтобы оптимизатор обновил их. Если вы используете pytorch <0.4, попробуйте использовать <code>torch.autograd.Variable(). Например:

import torch
import torch.utils.data
from torch import nn, optim
from torch.nn import functional as F

class TEMP(nn.Module):

    # Whole architecture
    def __init__(self):
        super(TEMP, self).__init__()
        self.input = nn.Parameter(torch.ones(1,requires_grad = True)) # <----wrap it like this


    def forward(self,x):
        wt = self.input
        y = wt*x 
        return y

model = TEMP()
optimizer = optim.Adam(model.parameters(), lr=0.001)
x = torch.randn(100)
y = 5*x
loss = torch.sum((y - model(x)).pow(2))
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(model.input)

И обратите внимание, что если вы инициализируете тензор в pytorch> = 0,4, измените значение requires_grad = True, если хотите, чтобы эта переменная была обновлена.

0 голосов
/ 29 июня 2018

https://discuss.pytorch.org/t/gradients-exist-but-weights-not-updating/20484/2?u=wr01 имеет ответ, который я искал. Проблема состояла в том, что neuralnet.parameters() не клонирует список параметров, поэтому, когда я обновлял веса, они обновлялись в переменной before.

...