logits是啥、傅里叶变换

什么是logtis? 


在深度学习的上下文中,logits 就是一个向量,下一步通常被投给 softmax/sigmoid 的向量。。

softmax的输出是分类任务的概率,其输入是logits层。 logits层通常产生-infinity到+ infinity的值,而softmax层将其转换为0到1的值。

举个例子:

如果一个二分类模型的输出层是一个单节点,没有激活函数,输出值是2.5。则2.5就是这个样本被预测为正类的logits。
如果一个多分类模型的输出层是5个节点,没有激活函数,输出值是[1.2, 3.1, -0.5, 4.8, 2.3]。则这个向量表示该样本属于5个类别的logits。
logits可以取任意实数值,正值表示趋向于分类到该类,负值表示趋向于不分类到该类。与之对应,probability经过softmax/sigmoid归一化到0-1之间,表示属于该类的概率。

logtis在交叉熵损失中的示例:
logtis可以看作神经网络输出的未经过归一化(softmax/sigmoid)的概率,所以将其结果用于分类任务计算loss时,如求cross_entropy的loss函数会设置from_logits参数。

因此,当from_logtis=False(默认情况)时,可以理解为输入的y_pre不是来自logtis,那么它就是已经经过softmax或者sigmoid归一化后的结果了;当from_logtis=True时,则可以理解为输入的y_pre是logits,那么需要对它进行softmax或者sigmoid处理再计算cross entropy。

如下面的两种方式计算得到的loss都是一样的:

import torch
import torch.nn as nn
import torch.nn.functional as Ffrom_logits = True  # 标记logtis or sigmoid
y_pre = torch.FloatTensor([[5, 5], [2, 8]])  # logtis值:神经网络的输出,未概率归一化
y_true = torch.FloatTensor([[1, 0], [0, 1]])  # 真实的二分类标签if from_logits == True:# BCEWithLogitsLoss可以直接对logtis值进行二分类的损失计算criterion = nn.BCEWithLogitsLoss()loss = criterion(y_pre, y_true)
else:# BCELoss需要对logtis值进行概率归一化,然后再进行二分类的损失计算criterion = nn.BCELoss()y_pre = F.sigmoid(y_pre)loss = criterion(y_pre, y_true)
print(loss)

傅里叶变换
连续与离散
一般人们口中所说的傅里叶变换都是指连续傅里叶变换,针对的是连续时域信号。维基百科上是这么描述连续信号的:

连续信号或称连续时间信号是指定义在实数域的信号,自变量(一般是时间)的取值连续。若信号的幅值和自变量均连续,则称为模拟信号。根据实数的性质,时间参数的连续性意味着信号的值在时间的任意点均有定义。

简单来说,对于一个sin函数的连续信号,其波形长这样:

对于计算设备的信号处理,因为采样设备的采样率是有限的。因此得到的采样信号都是离散的,所以就有了针对离散信号的离散傅里叶变换。维基百科是这么描述离散信号:

离散信号是在连续信号上采样得到的信号。与连续信号的自变量是连续的不同,离散信号是一个串行,即其自变量是“离散”的。这个串行的每一个值都可以被看作是连续信号的一个采样。由于离散信号只是采样的串行,并不能从中获得采样率,因此采样率必须另外存储。以时间为自变量的离散信号为离散时间信号。
离散信号并不等同于数字信号。数字信号不仅是离散的,而且是经过量化的。即,不仅其自变量是离散的,其值也是离散的。因此离散信号的精度可以是无限的,而数字信号的精度是有限的。而有着无限精度,亦即在值上连续的离散信号又叫抽样信号。所以离散信号包括了数字信号和抽样信号。

信号的筛选

简单概括公式所表达的实际意义后,我们再来看为什么要这么做。废话少说直接按照傅里叶变换公式所描述的做法,将信号与各已频率信号乘法后积分,写一段简单的matlab程序。最终结果如下图:

从图上可以很清楚直观的看出,当未知信号与基信号频率相同时,他们乘积的积分达到了最大。而这个积分最终的图像是不是就很像信号经过傅里叶变换后的频域图像呢!利用了乘法负负得正的特性,当基信号与未知信号频率完全相同的时候,其时域上乘积全为正数。因此,此时的积分达到最大值。通过此类操作即可得到未知信号的频率。

说人话,就是用各种频率的基信号与未知信号做对比,看看哪个频率的基信号与未知信号最像!!!,而这个对比的方法,用数学来描述就是先相乘后积分,这样描述的话,是不是听起来就没那么复杂了。

初始相位的问题

上文所讨论的对未知信号频率的筛选,全部都是建立在未知信号相位为0的情况下。但是实际使用过程中,信号的相位与频率都是未知的,若只使用上文(4)所描述的方式肯定是不行的,如下图:

可以看到若未知信号的初始相位为90°,若还使用公式4,得出的结果与实际就有误了。

此时再回头看看傅里叶变换的公式,不难发现,傅里叶变换使用的是复数信号。e − j ω t = c o s ( ω t ) − j s i n ( ω t ) e^{-j\omega t} = cos(\omega t)-jsin(\omega t)e 
−jωt
 =cos(ωt)−jsin(ωt)。也就是说傅里叶变换对未知信号使用复数信号相乘后求积分。而不是只对单个正弦信号做比较。

不难看出,傅里叶变换的结果是复数信号,其结果实部的值就是表示未知信号与cos信号的相关度,虚部值表示未知信号与sin信号的相关度。由此可以看出,傅里叶变换的结果还包含了未知信号的相位信息。

为了分析其频率信息,我们可以对结果做取模开方处理

快速傅里叶变换(FFT)

快速傅里叶算法本质上是对离散傅里叶变化的改进,本质上是利用矩阵乘法时不同基信号在奇数或偶数点的与被采样信号的乘积相同来减少计算,严格的数学推断可以参考这篇快速理解FFT算法(完整无废话)

MATLAB 仿真代码

% 设置时间范围
t = 0:0.01:2*pi;
freq1 = 5;
freq2 = 0;% 创建GIF文件
filename = 'sin_wave_animation.gif';
fps = 120;% 初始化乘积结果的和
sum_of_product = zeros(1, length(t));
sum_of_product_sin = zeros(1, length(t));
sum_of_product_cos = zeros(1, length(t));for i = 1:length(t)% 生成两个不同频率的正弦波y1 = cos(freq1 * t);y2 = sin((freq2+i/10) * t);y3 = cos((freq2+i/10) * t);% 计算两个正弦波的乘积y_product_sin = y1 .* y2;y_product_cos = y1 .* y3;% 计算乘积结果的和sum_of_product_sin(i+1) = sum(y_product_sin);sum_of_product_cos(i+1) = sum(y_product_cos);sum_of_product = sqrt(power(sum_of_product_sin, 2) + power(sum_of_product_cos, 2));arr = 0:0.1:10;subplot(3, 1, 1);plot(arr(1:i), sum_of_product_sin(1:i), 'g'); % 只绘制当前时间点之前的数据xlabel('x');ylabel('y');xlim([0, 10]);ylim([-500, 500]);title('Re');arr = 0:0.1:10;subplot(3, 1, 2);plot(arr(1:i), sum_of_product_cos(1:i), 'g'); % 只绘制当前时间点之前的数据xlabel('x');ylabel('y');xlim([0, 10]);ylim([-500, 500]);title('Im');arr = 0:0.1:10;subplot(3, 1, 3);plot(arr(1:i), sum_of_product(1:i), 'g'); % 只绘制当前时间点之前的数据xlabel('x');ylabel('y');xlim([0, 10]);ylim([-500, 500]);title('sqrt(power(Re, 2) + power(Im, 2));');% 保存当前图像为GIFframe = getframe(gcf);im = frame2im(frame);[imind, cm] = rgb2ind(im, 256);if i == 1imwrite(imind, cm, filename, 'gif', 'Loopcount', inf, 'DelayTime', 1/fps);elseimwrite(imind, cm, filename, 'gif', 'WriteMode', 'append', 'DelayTime', 1/fps);endif i == 100break;endend

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Adobe Illustrator学习备忘

1.移动画板:需按住空格键加鼠标一块才能拖动 2.放大缩小画板:按住Alt键加鼠标滚轮 3.撤回:CtrlZ 4.钢笔练习网站:The Bzier Game

【初识】内网渗透——基础概念,基本工具使用

目录 一、域,工作组,域控制器,活动目录相关概念: 域环境: 工作组: 域控制器DC: 活动目录AD: 二、内网的基本场景: 三、内网渗透基本测试方案: #案例1一基本信…

remove_const的工作原理及c++的类型推导

author: hjjdebug date: 2025年 05月 21日 星期三 12:51:57 CST descrip: remove_const的工作原理及c的类型推导 文章目录 1. 简单的程序代码.2.std::remove_const_t 到底是怎样工作的?2.1 测试代码2.2 类型推导的调试手段.2.2.1 给类模板添加成员函数,让它打印信息…

人脸识别,使用 deepface + api + flask, 改写 + 调试

1. 起因, 目的, 感受: github deepface 这个项目写的很好, 继续研究使用这个项目,改写 api。增加一个前端 flask app 2. 先看效果 3. 过程: 大力改写原始项目中 api 这部分的代码, 原始项目的文件结构太繁杂了: 我把…

三维表面轮廓仪的维护保养是确保其长期稳定运行的关键

三维表面轮廓仪是一种高精度测量设备,用于非接触式或接触式测量物体表面的三维形貌、粗糙度、台阶高度、纹理特征等参数。其主要基于光学原理进行测量。它利用激光或其他光源投射到被测物体表面,通过接收反射光或散射光,结合计算机图像处理技…

Lambda表达式的高级用法

今天来分享下Java的Lambda表达式,以及它的高级用法。 使用它可以提高代码的简洁度,使代码更优雅。 一、什么是lambda表达式 Lambda 表达式是 Java 8 引入的特性,用于简化匿名内部类的语法,使代码更简洁,尤其在处理函…

31-35【动手学深度学习】深度学习硬件

1. CPU和GPU 1.1 CPU CPU每秒钟计算的浮点运算数为0.15,GPU为12。GPU的显存很低,16GB(可能32G封顶),CPU可以一直插内存。 左边是GPU(只能做些很简单的游戏,视频处理),中…

【MySQL成神之路】MySQL常见命令汇总

目录 MySQL常用命令总结 1. 数据库操作 2. 表操作 3. 数据操作(DML) 4. 索引与优化 5. 用户与权限管理 6. 备份与恢复 7. 事务控制 8. 常用函数 9. 系统状态与日志 总结 MySQL常用命令总结 MySQL作为最流行的关系型数据库之一,提供…

Dify的大语言模型(LLM) AI 应用开发平台-本地部署

前言 今天闲着,捣鼓一下 Dify 这个开源平台,在 mac 系统上,本地部署并运行 Dify 平台,下面记录个人在本地部署Dify 的过程。 Dify是什么? Dify是一个开源的大语言模型(LLM)应用开发平台&#…

【论文阅读】针对BEV感知的攻击

Understanding the Robustness of 3D Object Detection with Bird’s-Eye-View Representations in Autonomous Driving 这篇文章是发表在CVPR上的一篇文章,针对基于BEV的目标检测算法进行了两类可靠性分析,即恶劣自然条件以及敌对攻击。同时也提出了一…

SonarQube的核心作用与用途

SonarQube作为一个开源的代码质量管理平台,致力于持续分析代码的健康状态,帮助开发团队提升代码质量。以下是其核心作用与用途的详细说明: 1、静态代码分析 SonarQube通过静态代码分析技术,自动识别代码中的潜在问题。它能够检测…

AI工程师系列——面向copilot编程

前言 ​ 笔者已经使用copilot协助开发有一段时间了,但一直没有总结一个协助代码开发的案例,特别是怎么问copilot,按照什么顺序问,哪些方面可以高效的生成需要的代码,这一次,笔者以IP解析需求为例,沉淀一个实践案例,供大家参考 当然,其实也不局限于copilot本身,类似…

【软件设计师】知识点简单整理

文章目录 数据结构与算法排序算法图关键路径 软件工程决策表耦合类型 编程思想设计模式 计算机网络域名请求过程 数据结构与算法 排序算法 哪些排序算法是稳定的算法?哪些不是稳定的算法,请举出例子。 稳定排序算法:冒泡排序、插入排序、归并排序、基数排序、计数…

FastAPI 支持文件下载和上传

文章目录 1. 文件下载处理1.1. 服务端处理1.1.1. 下载小文件1.1.2. 下载大文件(yield 支持预览的)1.1.3. 下载大文件(bytes)1.1.4. 提供静态文件服务1.1.5. 中文文件名错误 1.2. 客户端处理1.2.1. 普通下载1.2.2. 分块下载1.2.3. …

naive-ui切换主题

1、在App.vue文件中使用 <script setup lang"ts"> import Dashboard from ./views/dashboard/index.vue import { NConfigProvider, NGlobalStyle, darkTheme } from naive-ui import { useThemeStore } from "./store/theme"; // 获取存储的主题类…

Kotlin 协程 (三)

协程通信是协程之间进行数据交换和同步的关键机制。Kotlin 协程提供了多种通信方式&#xff0c;使得协程能够高效、安全地进行交互。以下是对协程通信的详细讲解&#xff0c;包括常见的通信原语、使用场景和示例代码。 1.1 Channel 定义&#xff1a;Channel 是一个消息队列&a…

使用SQLite Studio导出/导入SQL修复损坏的数据库

使用SQLite Studio导出/导入SQL修复损坏的数据库 使用Zotero时遇到了数据库损坏&#xff0c;在软件中寸步难行&#xff0c;遂尝试修复数据库。 一、SQLite Studio简介 SQLite Studio是一款专为SQLite数据库设计的免费开源工具&#xff0c;支持Windows/macOS/Linux。相较于其…

【git config --global alias | Git分支操作效率提升实践指南】

git config --global alias | Git分支操作效率提升实践指南 背景与痛点分析 在现代软件开发团队中&#xff0c;Git分支管理是日常工作的重要组成部分。特别是在规范的开发流程中&#xff0c;我们经常会遇到类似 feature/user-management、bugfix/login-issue 或 per/cny/dev …

(八)深度学习---计算机视觉基础

分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.图像数字化表示及建模基础 二.卷积神经网络CNN基本原…

在tensorflow源码环境里,编译出独立的jni.so,避免依赖libtensorflowlite.so,从而实现apk体积最小化

需要在APP里使用tensorflow lite来运行PC端训练的model.tlite&#xff0c;又想apk的体积最小&#xff0c;尝试了如下方法&#xff1a; 1. 在gradle里配置 implementation("org.tensorflow:tensorflow-lite:2.16.1") 这样会引入tensorflow.jar&#xff0c;最终apk的…