«Нет» градиенты в pytorch - PullRequest
       15

«Нет» градиенты в pytorch

0 голосов
/ 29 августа 2018

Я пытаюсь реализовать простую MDN, которая прогнозирует параметры распределения по целевой переменной вместо значения точки, а затем назначает вероятности для дискретных элементов значения точки. Сужая вопрос, код, из которого возникает None:

import torch

# params
tte_bins = np.linspace(
    start=0, 
    stop=399, 
    num=400, 
    dtype='float32'
).reshape(1, 1, -1)
bins = torch.tensor(tte_bins, dtype=torch.float32)
x_train = np.random.randn(1, 1024, 3)
y_labels = np.random.randint(low=0, high=399, size=(1, 1024))
y_train = np.eye(400)[y_labels]

# data
in_train = torch.tensor(x_train[0:1, :, :], dtype=torch.float)
in_train = (in_train - torch.mean(in_train)) / torch.std(in_train)
out_train = torch.tensor(y_train[0:1, :, :], dtype=torch.float)

# model
linear = torch.nn.Linear(in_features=3, out_features=2)
lin = linear(in_train)
preds = torch.exp(lin)

# intermediate values
alpha = torch.clamp(preds[0:1, :, 0:1], 0, 500)
beta = torch.clamp(preds[0:1, :, 1:2], 0, 100)

# probs
p1 = torch.exp(-torch.pow(bins / alpha, beta))
p2 = torch.exp(-torch.pow((bins + 1.0) / alpha, beta))
probs = p1 - p2

# loss
loss = torch.mean(torch.pow(out_train - probs, 2))

# gradients
loss.backward()
for p in linear.parameters():
    print(p.grad, 'gradient')

in_train имеет форму: [1, 1024, 3], out_train имеет форму: [1, 1024, 400], контейнеры имеют форму: [1, 1, 400]. Все трансляции и т. Д. Появляются, находят, результирующие матрицы (например, альфа / бета / потери) имеют правильную форму и имеют правильные значения - просто нет градиентов

edit: добавлено loss.backward() и x_train/y_train, теперь у меня есть nans

1 Ответ

0 голосов
/ 29 августа 2018

Вы просто забыли вычислить градиенты. Пока вы вычисляете потери, вы никогда не сообщаете pytorch относительно какой функции он должен рассчитывать градиенты.

Простое добавление

loss.backward()

к вашему коду должна решить проблему.

Кроме того, в вашем коде некоторые промежуточные результаты, такие как alpha, иногда равны нулю, но находятся в знаменателе при вычислении градиента. Это приведет к nan результатам, которые вы наблюдали.

...