我有两个张量分别为x_t
和x_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
方法。
但是,它似乎并没有像我预期的那样工作。我正在计算K
和kl_div
中每个观测值之间的x_t
,从而得出大小为x_k
(即,每个观测值KxN
)的张量每个kl_div
自动编码器)。
如果我使用K
参数,则实际输出是单个值;如果我不使用它,则相同的张量大小(即reduction
)。
有人尝试过类似的东西吗?
可复制的示例:
KxNxHxW
答案 0 :(得分:1)
我不清楚您的模型中什么构成概率分布。使用reduction='none'
,给定kl_div
和log(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))
。如果要对网络输出进行不同的解释,则需要更好地指定哪些是事件维度,哪些是分发的样本维度。