使用pytorch怎么计算 kl散度 ?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
如果现在想用Y指导X,第一个参数要传X,第二个要传Y。就是被指导的放在前面,然后求相应的概率和对数概率就可以了。
import torchimport torch.nn.functional as F# 定义两个矩阵x = torch.randn((4, 5))y = torch.randn((4, 5))# 因为要用y指导x,所以求x的对数概率,y的概率logp_x = F.log_softmax(x, dim=-1)p_y = F.softmax(y, dim=-1) kl_sum = F.kl_div(logp_x, p_y, reduction='sum')kl_mean = F.kl_div(logp_x, p_y, reduction='mean') print(kl_sum, kl_mean) >>> tensor(3.4165) tensor(0.1708)
补充:pytorch中的kl散度,为什么kl散度是负数?
F.kl_div()或者nn.KLDivLoss()是pytroch中计算kl散度的函数,它的用法有很多需要注意的细节。
输入
第一个参数传入的是一个对数概率矩阵,第二个参数传入的是概率矩阵。并且因为kl散度具有不对称性,存在一个指导和被指导的关系,因此这连个矩阵输入的顺序需要确定一下。如果现在想用Y指导X,第一个参数要传X,第二个要传Y。就是被指导的放在前面,然后求相应的概率和对数概率就可以了。
所以,一随机初始化一个tensor为例,对于第一个输入,我们需要先对这个tensor进行softmax(确保各维度和为1),然后再取log;对于第二个输入,我们需要对这个tensor进行softmax。
import torchimport torch.nn.functional as Fa = torch.tensor([[0,0,1.1,2,0,10,0],[0,0,1,2,0,10,0]])log_a =F.log_softmax(a)b = torch.tensor([[0,0,1.1,2,0,7,0],[0,0,1,2,0,10,0]])softmax_b =F.softmax(b,dim=-1)kl_mean = F.kl_div(log_a, softmax_b, reduction='mean')print(kl_mean)
为什么KL散度计算出来为负数
先确保对第一个输入进行了softmax+log操作,对第二个参数进行了softmax操作。不进行softmax操作就可能为负。
然后查看自己的输入是否是小数点后有很多位,当小数点后很多位的时候,pytorch下的softmax会产生各维度和不为1的现象,导致kl散度为负,如下所示:
a = torch.tensor([[0.,0,0.000001,0.0000002,0,0.0000007,0]])log_a =F.log_softmax(a,dim=-1)print("log_a:",log_a)b = torch.tensor([[0.,0,0.000001,0.0000002,0,0.0000007,0]])softmax_b =F.softmax(b,dim=-1)print("softmax_b:",softmax_b)kl_mean = F.kl_div(log_a, softmax_b,reduction='mean')print("kl_mean:",kl_mean)
输出如下,我们可以看到softmax_b的各维度和不为1:
pytorch的优点
1.PyTorch是相当简洁且高效快速的框架;2.设计追求最少的封装;3.设计符合人类思维,它让用户尽可能地专注于实现自己的想法;4.与google的Tensorflow类似,FAIR的支持足以确保PyTorch获得持续的开发更新;5.PyTorch作者亲自维护的论坛 供用户交流和求教问题6.入门简单
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。