【问题标题】:'None' gradients in pytorchpytorch中的“无”渐变
【发布时间】:2018-08-29 00:15:02
【问题描述】:

我正在尝试实现一个简单的 MDN,它预测目标变量而不是点值上的分布参数,然后将概率分配给点值的离散箱。缩小问题范围,“无”的代码是:

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],bins 的形状为:[1, 1, 400]。所有广播等.. 似乎都找到了,生成的矩阵(如 alpha/beta/loss)是正确的形状并且具有正确的值 - 根本没有梯度

编辑:添加了loss.backward()x_train/y_train,现在我有了nans

【问题讨论】:

  • 您能否添加有关您输入x_trainy_train 的信息?
  • 添加示例数据,nans 似乎来自其他地方
  • 你从不使用y_labels 并且test没有定义。您的代码应该始终保持最小且可重复。
  • 当您计算 p1p2 时,渐变会爆炸。使用preds.sum().backward() 仍然会产生有效的渐变。我不知道你想用你的模型计算什么。但是,例如,在计算 p1 相对于 alpha 的导数时,您会得到 bins**(beta) 的乘法因子,这可能会非常大。
  • 注意到,修复了 test/y_labels

标签: python machine-learning pytorch mixture-model


【解决方案1】:

您只是忘记了计算梯度。在计算损失时,您永远不会告诉 pytorch 它应该使用哪个函数来计算梯度。

简单添加

loss.backward()

您的代码应该可以解决问题。

此外,在您的代码中,一些中间结果(例如 alpha)有时为零,但在计算梯度时位于分母中。这将导致您观察到的nan 结果。

【讨论】:

  • 已添加,除了现在我将所有 nan 作为渐变输出
猜你喜欢
  • 2019-08-27
  • 1970-01-01
  • 2018-08-15
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2018-09-14
相关资源
最近更新 更多