У меня есть два тензора с именами x_t
, x_k
со следующими формами NxHxW
и KxNxHxW
соответственно, где K
- это количество автоэнкодеров, использованных для восстановления x_t
(если вы не знаете, чтоэто, предположим, что они K
разные сети, стремящиеся предсказать x_t
, это вероятно не имеет никакого отношения к вопросу в любом случае) N
- размер партии, H
высота матрицы, W
ширина матрицы.
Я пытаюсь применить алгоритм Расхождение Кульбака-Лейблера к обоим тензорам (после трансляции x_t
как x_k
вдоль K
th размерность), используя метод Пиорча nn.functional.kl_div
.
Однако, похоже, он не работает , как я ожидал .Я рассчитываю вычислить kl_div
между каждым наблюдением в x_t
и x_k
, получая тензор размером KxN
(т. Е. kl_div
каждого наблюдения для каждого K
автоэнкодера).
Фактическим выходным значением является одиночное значение , если я использую аргумент reduction
, и тот же тензорный размер (т. Е. KxNxHxW
), если я его не использую.
Кто-нибудь пробовал что-то подобное?
Воспроизводимый пример:
import torch
import torch.nn.functional as F
# K N H W
x_t = torch.randn( 10, 5, 5)
x_k = torch.randn( 3, 10, 5, 5)
x_broadcasted = x_t.expand_as(x_k)
loss = F.kl_div(x_t, x_k, reduction="none") # or "batchmean", or there are many options