返回顶部
首页 > 资讯 > 后端开发 > Python >pytorch 实现计算 kl散度 F.kl_div()
  • 430
分享到

pytorch 实现计算 kl散度 F.kl_div()

2024-04-02 19:04:59 430人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

先附上官方文档说明:https://PyTorch.org/docs/stable/nn.functional.html torch.nn.functional.kl_div(in

先附上官方文档说明:https://PyTorch.org/docs/stable/nn.functional.html

torch.nn.functional.kl_div(input, target, size_average=None, reduce=None, reduction='mean')

Parameters

input – Tensor of arbitrary shape

target – Tensor of the same shape as input

size_average (bool, optional) – Deprecated (see reduction). By default, the losses are averaged over each loss element in the batch. Note that for some losses, there multiple elements per sample. If the field size_average is set to False, the losses are instead summed for each minibatch. Ignored when reduce is False. Default: True

reduce (bool, optional) – Deprecated (see reduction). By default, the losses are averaged or summed over observations for each minibatch depending on size_average. When reduce is False, returns a loss per batch element instead and ignores size_average. Default: True

reduction (string, optional) – Specifies the reduction to apply to the output: 'none' | 'batchmean' | 'sum' | 'mean'. 'none': no reduction will be applied 'batchmean': the sum of the output will be divided by the batchsize 'sum': the output will be summed 'mean': the output will be divided by the number of elements in the output Default: 'mean'

然后看看怎么用:

第一个参数传入的是一个对数概率矩阵,第二个参数传入的是概率矩阵。这里很重要,不然求出来的kl散度可能是个负值。

比如现在我有两个矩阵X, Y。因为kl散度具有不对称性,存在一个指导和被指导的关系,因此这连个矩阵输入的顺序需要确定一下。

举个例子:

如果现在想用Y指导X,第一个参数要传X,第二个要传Y。就是被指导的放在前面,然后求相应的概率和对数概率就可以了。


import torch
import 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 torch
import torch.nn.functional as F

a = 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:

在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: pytorch 实现计算 kl散度 F.kl_div()

本文链接: https://lsjlt.com/news/126630.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • pytorch 实现计算 kl散度 F.kl_div()
    先附上官方文档说明:https://pytorch.org/docs/stable/nn.functional.html torch.nn.functional.kl_div(in...
    99+
    2024-04-02
  • 使用pytorch怎么计算 kl散度
    使用pytorch怎么计算 kl散度 ?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如果现在想用Y指导X,第一个参数要传X,第二个要传Y。就是被指导的放在前面,...
    99+
    2023-06-15
  • 解决pytorch中的kl divergence计算问题
    偶然从pytorch讨论论坛中看到的一个问题,KL divergence different results from tf,kl divergence 在TensorFlow中和p...
    99+
    2024-04-02
  • PyTorch 如何自动计算梯度
    在PyTorch中,torch.Tensor类是存储和变换数据的重要工具,相比于Numpy,Tensor提供GPU计算和自动求梯度等更多功能,在深度学习中,我们经常需要对函数求梯度(...
    99+
    2024-04-02
  • PyTorch怎么如何自动计算梯度
    小编给大家分享一下PyTorch怎么如何自动计算梯度,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在PyTorch中,torch.Tensor类是存储和变换数据的...
    99+
    2023-06-15
  • pytorch MSELoss计算平均的实现方法
    给定损失函数的输入y,pred,shape均为bxc。 若设定loss_fn = torch.nn.MSELoss(reduction='mean'),最终的输出值其实是(y - p...
    99+
    2024-04-02
  • PyTorch深度学习实战(5)——计算机视觉基础
    PyTorch深度学习实战(5)——计算机视觉基础 0. 前言 1. 图像表示 2. 将图像转换为结构化数组 2.1 灰度图像表示 ...
    99+
    2023-09-07
    深度学习 pytorch 计算机视觉 原力计划
  • 在 pytorch 中实现计算图和自动求导
    前言: 今天聊一聊 pytorch 的计算图和自动求导,我们先从一个简单例子来看,下面是一个简单函数建立了 yy 和 xx 之间的关系 然后...
    99+
    2024-04-02
  • pytorch 禁止/允许计算局部梯度的操作
    一、禁止计算局部梯度 torch.autogard.no_grad: 禁用梯度计算的上下文管理器。 当确定不会调用Tensor.backward()计算梯度时,设置禁止计算梯度会减少...
    99+
    2024-04-02
  • 基于JavaScript实现数值型坐标轴刻度计算算法(echarts的y轴刻度计算)
    目录前言算法描述代码ts版本(2021/3/10补充)结语前言 因实习的公司是做大数据的,而我的工作刚好又是需要绘制一些数据图表的。绘制图表有许多现成的组件可以使用,但是要想达到产品...
    99+
    2024-04-02
  • sqlserver怎么实现离散组合算法
    在SQL Server中实现离散组合算法可以通过使用递归函数来实现。下面是一个示例代码来计算离散组合: CREATE FUNCTIO...
    99+
    2024-04-09
    sqlserver
  • Android Color颜色过度计算实现代码
    Android Color颜色过度计算实现代码在看自定义TypeEvaluator来计算属性动画的属性值时,用到了对颜色的过度计算,翻看了好多博客,找到了比较有优秀的解决方案,在此记录,以备后用。实现效果图:实现代码:private int...
    99+
    2023-05-31
    android color 颜色
  • 利用PyTorch实现爬山算法
    目录0. 前言1. 使用 PyTorch 实现爬山算法1.1 爬山算法简介1.2 使用爬山算法进行 CartPole 游戏2. 改进爬山算法0. 前言 在随机搜索策略中,每个回合都是...
    99+
    2024-04-02
  • pyTorch深度学习softmax实现解析
    目录用PyTorch实现linear模型模拟数据集定义模型加载数据集optimizer模型训练softmax回归模型Fashion-MNISTcross_entropy模型的实现利用...
    99+
    2024-04-02
  • android studio 项目 :UI设计高精度实现简单计算器
    UI设计: 实验目的: 自主完成一个简单APP的设计工作,综合应用已经学到的Android UI设计技巧,重点注意合理使用布局。实验要求: 1.完成一个计算器的设计,可以以手机自带的...
    99+
    2024-04-02
  • mAP计算目标检测精确度实现源码
    目录GITHUB代码下载1、IOU的概念2、TP TN FP FN的概念3、precision(精确度)和recall(召回率)4、概念举例5、单个指标的局限性什么是AP绘制mAP好...
    99+
    2024-04-02
  • 整层水汽通量和整层水汽通量散度计算及python绘图
    整层水汽通量和整层水汽通量散度计算及python绘图 一、公式推导 1、整层水汽通量: (1)单层水汽通量: 在P坐标下, 单层水汽通量 = q·v/g q的单位为kg/kg,v的单位为m/s。对于重...
    99+
    2023-09-15
    python matplotlib 开发语言
  • PyTorch实现FedProx联邦学习算法
    目录I. 前言III. FedProx1. 模型定义2. 服务器端3. 客户端更新IV. 完整代码I. 前言 FedProx的原理请见:FedAvg联邦学习FedProx异质网络优化...
    99+
    2024-04-02
  • PyTorch怎么实现基本算法FedAvg
    本文小编为大家详细介绍“PyTorch怎么实现基本算法FedAvg”,内容详细,步骤清晰,细节处理妥当,希望这篇“PyTorch怎么实现基本算法FedAvg”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。数据介绍联...
    99+
    2023-06-30
  • Java实现计算器设计
    本文实例为大家分享了Java实现计算器设计的具体代码,供大家参考,具体内容如下 需求分析 目的是实现一个基于Java的可以求解带括号加减乘除表达式的带界面的计算器。 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作