pytorch 笔记:KLDivLoss

1 介绍

对于具有相同形状的张量 ypred​ 和 ytrue(ypred​ 是输入,ytrue​ 是目标),定义逐点KL散度为:

为了在计算时避免下溢问题,此KLDivLoss期望输入在对数空间中。如果log_target=True,则目标也在对数空间。

2 参数

reduction

pytorch 笔记:KLDivLoss_第1张图片

reduction= “mean”不返回真正的KL散度值,reduction= “batchmean”才是

log_target 指定目标是否在对数空间中

3 举例

import torch
import torch.nn as nn


input = torch.tensor([[0.5, -0.5, 0.1], [0.1, -0.2, 0.3]], requires_grad=True)

target = torch.tensor([[0.7, 0.2, 0.1], [0.1, 0.5, 0.4]])

loss_function = nn.KLDivLoss(reduction='batchmean')
loss = loss_function(input, target)
print(loss)
#tensor(-1.0176, grad_fn=)

等价手动形式:

target*(target.log()-input)
'''
tensor([[-0.5997, -0.2219, -0.2403],
        [-0.2403, -0.2466, -0.4865]], grad_fn=)
'''

#这里的每个元素计算方式为:
'''
tensor([[-0.5997, -0.2219, -0.2403],
        [-0.2403, -0.2466, -0.4865]], grad_fn=)
'''

torch.sum(target*(target.log()-input))/2
#tensor(-1.0176, grad_fn=)

你可能感兴趣的:(pytorch学习,pytorch,笔记,人工智能)