在Pytorch中逐个应用Kullback-Leibler(又称kl发散)

时间:2019-04-02 02:52:07

标签: python pytorch

我有两个张量分别为x_tx_k的{​​{1}},NxHxW,其中KxNxHxW是用于重构的自动编码器的数量K(如果您不知道这是什么,请假设它们是x_t旨在预测K的不同网络,那么可能与仍然是问题)x_t是批处理大小,N矩阵高度,H矩阵宽度。

我正在尝试将Kullback-Leibler divergence算法应用于两个张量(沿W 维度将x_t广播为x_k之后) Pytorch's nn.functional.kl_div方法。

但是,它似乎并没有像我预期的那样工作。我正在计算Kkl_div中每个观测值之间的x_t,从而得出大小为x_k(即,每个观测值KxN)的张量每个kl_div自动编码器)。

如果我使用K参数,则实际输出是单个值;如果我不使用它,则相同的张量大小(即reduction)。

有人尝试过类似的东西吗?


可复制的示例:

KxNxHxW

1 个答案:

答案 0 :(得分:1)

我不清楚您的模型中什么构成概率分布。使用reduction='none',给定kl_divlog(x_n)的{​​{1}},计算y_n,这是实际Kullback-Leibler散度的“求和”部分。求和(或换句话说,接受期望)取决于您。如果您的意思是kl_div = y_n * (log(y_n) - log(x_n))是您要期望的两个维度,那么它就很简单

H, W

形状为loss = F.kl_div(x_t, x_k, reduction="none").sum(dim=(-1, -2)) 。如果要对网络输出进行不同的解释,则需要更好地指定哪些是事件维度,哪些是分发的样本维度。