我发现的所有回归示例都是您预测实数的示例,与分类不同,您不会预测该数字时模型的置信度。我已经用强化学习做了另一种方式,输出是mean和std然后你从那个分布中取样。然后你知道模型对预测每个价值的信心。现在我无法在pytorch中使用监督学习来找到如何做到这一点。问题是我不明白如何从分布中获取样本,在训练时得到实际值或我应该使用什么样的损失函数,不知道如何使用例如MSE或L1Smooth。
有没有任何一个例子可以在火葬场以强大而先进的方式完成?
答案 0 :(得分:1)
关键是您不需要从NN生成的分发中进行采样。您所需要的只是优化NN分布下目标值的可能性。
关于VAE(https://github.com/pytorch/examples/tree/master/vae)的官方PyTorch示例中有一个示例,但是对于多维伯努利分布。
自PyTorch 0.4以来,您可以使用torch.distributions:使用您的NN的输出实例化分发distro
,然后优化-distro.log_prob(target)
。
编辑:根据评论中的要求,使用torch.distributions
模块的完整示例。
首先,我们创建一个异方差数据集:
import numpy as np
import torch
X = np.random.uniform(size=300)
Y = X + 0.25*X*np.random.normal(size=X.shape[0])
我们构建了一个简单的模型,它完全能够匹配我们数据的生成过程:
class Model(torch.nn.Module):
def __init__(self):
super().__init__()
self.mean_coeff = torch.nn.Parameter(torch.Tensor([0]))
self.var_coeff = torch.nn.Parameter(torch.Tensor([1]))
def forward(self, x):
return torch.distributions.Normal(self.mean_coeff * x, self.var_coeff * x)
mdl = Model()
optim = torch.optim.SGD(mdl.parameters(), lr=1e-3)
模型的初始化使得它总是产生标准法线,这不适合我们的数据,所以我们训练(注意这是一个非常愚蠢的批量训练,但证明你可以为你的批量输出一组分布马上):
for _ in range(2000): # epochs
dist = mdl(torch.from_numpy(X).float())
obj = -dist.log_prob(torch.from_numpy(Y).float()).mean()
optim.zero_grad()
obj.backward()
optim.step()
最终,学习的参数应与我们用于构造Y的值匹配。
print(mdl.mean_coeff, mdl.var_coeff)
# tensor(1.0150) tensor(0.2597)