python - pytorch中的“无”渐变
问题描述
我正在尝试实现一个简单的 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
解决方案
你只是忘了计算梯度。在计算损失时,您永远不会告诉pytorch
它应该计算梯度的函数。
只需添加
loss.backward()
到您的代码应该可以解决问题。
此外,在您的代码中,一些中间结果(例如alpha
有时为零,但在计算梯度时位于分母中)。这将导致nan
您观察到的结果。
推荐阅读
- bash - ZSH:找不到命令 - 将 macOS 更新到 10.15.1 后
- php - 如何在 Laravel 命令而不是控制器中发送电子邮件
- swift - 如何在 Swift 5 中的 AWS-SES 上创建 RAW-Email-Message
- c# - net framework 4.6.1 无参数构造函数中依赖注入的配置问题
- ios - 谷歌驱动器显示自定义 UTI 文件在 UIDocumentBrowserViewController 控制器中变暗
- java - 如何将 Places API 自动完成小部件传递给自定义对话框?
- android - 无法将库添加到 Android
- mysql - Mysql Cluster binlog 复制顺序
- mqtt - Apache MQ Artemis - 连接到集群中其他节点的客户端无法使用 MQTT 保留消息
- mongodb - 通过cmd命令在mongo集合中插入数据