深度学习中的数值稳定性处理详解:以SimCLR损失为例
文章目录
- 1. 问题背景
- SimCLR的原始公式
- 2. 数值溢出问题
- 为什么会出现数值溢出?
- 浮点数的表示范围
- 3. 数值稳定性处理方法
- 核心思想
- 数学推导
- 4. 代码实现分解
- 代码与公式的对应关系
- 5. 具体数值示例
- 示例:相似度矩阵
- 方法1:直接计算exp(x)
- 方法2:减去最大值后计算
- 验证结果等价性
- 6. 为什么减去最大值有效?
- 关键原理
- 7. 实际应用场景
- 8. 实现建议
- 总结
在深度学习实现中,特别是涉及指数和对数运算的损失函数计算过程中,数值稳定性是一个核心问题。本文以SimCLR对比学习损失为例,详细解析数值稳定性处理的原理、实现和重要性。
1. 问题背景
SimCLR是一种自监督学习方法,其核心是InfoNCE损失函数。这个损失函数的计算涉及大量指数运算,容易导致数值溢出或下溢问题。
SimCLR的原始公式
SimCLR的核心损失函数(InfoNCE损失)公式为:
L i = − log exp ( s i m ( z i , z j ) / τ ) ∑ k = 1 2 N exp ( s i m ( z i , z k ) / τ ) ⋅ 1 k ≠ i L_i = -\log \frac{\exp(sim(z_i, z_j)/\tau)}{\sum_{k=1}^{2N} \exp(sim(z_i, z_k)/\tau) \cdot \mathbf{1}_{k \neq i}} Li=−log∑k=12Nexp(sim(zi,zk)/τ)⋅1k=iexp(sim(zi,zj)/τ)
其中:
- z i z_i zi是锚点特征
- z j z_j zj是与 z i z_i zi对应的正样本特征
- τ \tau τ是温度参数
- s i m ( ) sim() sim()是相似度函数(通常是点积)
- 1 k ≠ i \mathbf{1}_{k \neq i} 1k=i表示排除自身对比的指示函数
2. 数值溢出问题
为什么会出现数值溢出?
当我们计算 exp ( x ) \exp(x) exp(x)时:
- 如果 x x x很大(如 x = 100 x = 100 x=100), exp ( 100 ) ≈ 2.7 × 1 0 43 \exp(100) \approx 2.7 \times 10^{43} exp(100)≈2.7×1043,可能超出浮点数表示范围
- 如果 x x x是很小的负数(如 x = − 100 x = -100 x=−100), exp ( − 100 ) ≈ 3.7 × 1 0 − 44 \exp(-100) \approx 3.7 \times 10^{-44} exp(−100)≈3.7×10−44,可能导致下溢为0
在SimCLR中, s i m ( z i , z k ) / τ sim(z_i, z_k)/\tau sim(zi,zk)/τ可能很大,特别是当:
- 特征向量高度相似( s i m sim sim接近1)
- 温度参数 τ \tau τ很小(如0.07)
浮点数的表示范围
浮点数的表示范围是有限的:
- 单精度浮点数(32位):约 ± 3.4 × 1 0 38 \pm 3.4 \times 10^{38} ±3.4×1038
- 双精度浮点数(64位):约 ± 1.8 × 1 0 308 \pm 1.8 \times 10^{308} ±1.8×10308
3. 数值稳定性处理方法
SimCLR实现中使用了一种简单而有效的数值稳定性处理技术,代码如下:
# 数值稳定性处理
logits_max, _ = torch.max(anchor_dot_contrast, dim=1, keepdim=True)
logits = anchor_dot_contrast - logits_max.detach()
核心思想
这种处理的核心思想是:
- 找出每行相似度的最大值
- 将每行的所有值减去这个最大值
- 然后再进行指数计算
数学推导
这种操作是数学等价的。对原始公式进行变换:
L i = − log exp ( s i m ( z i , z j ) / τ ) ∑ k = 1 2 N exp ( s i m ( z i , z k ) / τ ) ⋅ 1 k ≠ i \begin{align} L_i &= -\log \frac{\exp(sim(z_i, z_j)/\tau)}{\sum_{k=1}^{2N} \exp(sim(z_i, z_k)/\tau) \cdot \mathbf{1}_{k \neq i}} \\ \end{align} Li=−log∑k=12Nexp(sim(zi,zk)/τ)⋅1k=iexp(sim(zi,zj)/τ)
引入最大值 M i = max k ( s i m ( z i , z k ) / τ ) M_i = \max_k (sim(z_i, z_k)/\tau) Mi=maxk(sim(zi,zk)/τ):
L i = − log exp ( s i m ( z i , z j ) / τ − M i + M i ) ∑ k = 1 2 N exp ( s i m ( z i , z k ) / τ − M i + M i ) ⋅ 1 k ≠ i = − log exp ( M i ) ⋅ exp ( s i m ( z i , z j ) / τ − M i ) exp ( M i ) ⋅ ∑ k = 1 2 N exp ( s i m ( z i , z k ) / τ − M i ) ⋅ 1 k ≠ i = − log exp ( s i m ( z i , z j ) / τ − M i ) ∑ k = 1 2 N exp ( s i m ( z i , z k ) / τ − M i ) ⋅ 1 k ≠ i \begin{align} L_i &= -\log \frac{\exp(sim(z_i, z_j)/\tau - M_i + M_i)}{\sum_{k=1}^{2N} \exp(sim(z_i, z_k)/\tau - M_i + M_i) \cdot \mathbf{1}_{k \neq i}} \\ &= -\log \frac{\exp(M_i) \cdot \exp(sim(z_i, z_j)/\tau - M_i)}{\exp(M_i) \cdot \sum_{k=1}^{2N} \exp(sim(z_i, z_k)/\tau - M_i) \cdot \mathbf{1}_{k \neq i}} \\ &= -\log \frac{\exp(sim(z_i, z_j)/\tau - M_i)}{\sum_{k=1}^{2N} \exp(sim(z_i, z_k)/\tau - M_i) \cdot \mathbf{1}_{k \neq i}} \end{align} Li=−log∑k=12Nexp(sim(zi,zk)/τ−Mi+Mi)⋅1k=iexp(sim(zi,zj)/τ−Mi+Mi)=−logexp(Mi)⋅∑k=12Nexp(sim(zi,zk)/τ−Mi)⋅1k=iexp(Mi)⋅exp(sim(zi,zj)/τ−Mi)=−log∑k=12Nexp(sim(zi,zk)/τ−Mi)⋅1k=iexp(sim(zi,zj)/τ−Mi)
因为分子和分母中的 exp ( M i ) \exp(M_i) exp(Mi)相互抵消,所以最终结果不变。
4. 代码实现分解
完整的SimCLR损失计算代码(包含数值稳定性处理):
# 计算相似度矩阵并除以温度系数
anchor_dot_contrast = torch.div(torch.matmul(anchor_feature, contrast_feature.T),self.temperature)# 数值稳定性处理
logits_max, _ = torch.max(anchor_dot_contrast, dim=1, keepdim=True)
logits = anchor_dot_contrast - logits_max.detach()# 创建和应用掩码
mask = mask.repeat(anchor_count, contrast_count)
logits_mask = torch.scatter(torch.ones_like(mask),1,torch.arange(batch_size * anchor_count).view(-1, 1).to(device),0
)
mask = mask * logits_mask# 计算损失
exp_logits = torch.exp(logits) * logits_mask
log_prob = logits - torch.log(exp_logits.sum(1, keepdim=True))
mean_log_prob_pos = (mask * log_prob).sum(1) / mask.sum(1)
loss = -(self.temperature / self.base_temperature) * mean_log_prob_pos
loss = loss.view(anchor_count, batch_size).mean()
代码与公式的对应关系
anchor_dot_contrast
→ s i m ( z i , z k ) / τ sim(z_i, z_k)/\tau sim(zi,zk)/τlogits_max
→ M i = max k ( s i m ( z i , z k ) / τ ) M_i = \max_k (sim(z_i, z_k)/\tau) Mi=maxk(sim(zi,zk)/τ)logits
→ s i m ( z i , z k ) / τ − M i sim(z_i, z_k)/\tau - M_i sim(zi,zk)/τ−Miexp_logits
→ exp ( s i m ( z i , z k ) / τ − M i ) ⋅ 1 k ≠ i \exp(sim(z_i, z_k)/\tau - M_i) \cdot \mathbf{1}_{k \neq i} exp(sim(zi,zk)/τ−Mi)⋅1k=ilog_prob
→ log exp ( s i m ( z i , z k ) / τ − M i ) ∑ k exp ( s i m ( z i , z k ) / τ − M i ) ⋅ 1 k ≠ i \log \frac{\exp(sim(z_i, z_k)/\tau - M_i)}{\sum_{k} \exp(sim(z_i, z_k)/\tau - M_i) \cdot \mathbf{1}_{k \neq i}} log∑kexp(sim(zi,zk)/τ−Mi)⋅1k=iexp(sim(zi,zk)/τ−Mi)
5. 具体数值示例
为了直观理解,我们用一个简化的例子来说明为什么减去最大值能防止数值溢出。
示例:相似度矩阵
假设有一个计算得到的相似度矩阵(已除以温度τ=0.07):
sim(z_i, z_k)/τ = [[80, 50, 60, 70, 40],[60, 90, 70, 80, 50],[70, 60, 85, 75, 55],[50, 40, 60, 75, 45]
]
方法1:直接计算exp(x)
直接计算exp(sim(z_i, z_k)/τ)
:
exp(sim(z_i, z_k)/τ) ≈ [[5.54e+34, 5.18e+21, 1.14e+26, 2.51e+30, 2.35e+17],[1.14e+26, 1.22e+39, 2.51e+30, 5.54e+34, 5.18e+21],[2.51e+30, 1.14e+26, 5.91e+36, 3.58e+32, 1.14e+24],[5.18e+21, 2.35e+17, 1.14e+26, 3.58e+32, 3.49e+19]
]
这些值极其巨大,相加时很容易溢出。例如第一行的和约为5.54e+34,已经接近单精度浮点数的上限。
方法2:减去最大值后计算
找出每行的最大值:
max_values = [80, 90, 85, 75]
减去最大值:
adjusted_logits = [[0, -30, -20, -10, -40],[-30, 0, -20, -10, -40],[-15, -25, 0, -10, -30],[-25, -35, -15, 0, -30]
]
计算exp(adjusted_logits)
:
exp(adjusted_logits) ≈ [[1.0, 9.36e-14, 2.06e-9, 4.54e-5, 4.25e-18],[9.36e-14, 1.0, 2.06e-9, 4.54e-5, 4.25e-18],[3.06e-7, 1.39e-11, 1.0, 4.54e-5, 9.36e-14],[1.39e-11, 6.31e-16, 3.06e-7, 1.0, 9.36e-14]
]
这些值都在[0,1]范围内,完全避免了溢出问题。同时,正样本对和负样本对之间的相对比例关系保持不变。
验证结果等价性
例如,对于第一行计算最终的归一化概率:
原始方法:
P(z_0 -> z_0) = exp(80) / sum(exp(row_0)) ≈ 1.0
P(z_0 -> z_1) = exp(50) / sum(exp(row_0)) ≈ 9.35e-14
...
减去最大值后:
P(z_0 -> z_0) = exp(0) / sum(exp(adjusted_row_0)) ≈ 1.0
P(z_0 -> z_1) = exp(-30) / sum(exp(adjusted_row_0)) ≈ 9.35e-14
...
两种计算方法得到的概率分布是相同的,但后者避免了数值溢出风险。
6. 为什么减去最大值有效?
关键原理
减去最大值的处理之所以有效,是因为:
-
将范围控制在安全区间:
- 减去最大值后,所有值都≤0
- 因此所有
exp(x)
的结果都≤1,避免了上溢 - 同时最大值对应的
exp(0)=1
,避免了整体下溢为0
-
保持相对比例关系:
- 对每行减去相同的常数不改变值之间的相对大小
- 对于
exp()
函数来说,这等价于同时除以一个常数因子 - 在计算Softmax或对数概率时,这个常数因子在分子和分母中抵消
-
数学等价性:
exp(a-b) = exp(a)/exp(b)
的性质保证了结果的正确性- 这相当于将原始公式的分子和分母同时除以
exp(max_value)
7. 实际应用场景
这种数值稳定性技术不仅适用于SimCLR,还广泛应用于:
- Softmax计算:几乎所有需要计算Softmax的地方都需要
- 交叉熵损失:分类任务中常用
- 注意力机制:Transformer中的attention计算
- 所有对比学习方法:MoCo、BYOL、CLIP等
8. 实现建议
在实现涉及指数计算的函数时,建议:
- 始终使用数值稳定性处理
- 对每个batch/样本独立进行处理(找到每行/每个样本的最大值)
- 使用
.detach()
阻止梯度通过最大值操作传播 - 注意掩码操作,确保不包括自身对比或特定的负样本
总结
数值稳定性处理是深度学习实现中一个看似简单但至关重要的技术。通过简单地减去每行的最大值,我们可以有效防止数值溢出/下溢问题,同时保持计算结果的数学等价性。这种技术尤其重要,因为随着模型和批量大小的增加,数值问题更容易出现,而且往往难以诊断。
相关文章:
深度学习中的数值稳定性处理详解:以SimCLR损失为例
文章目录 1. 问题背景SimCLR的原始公式 2. 数值溢出问题为什么会出现数值溢出?浮点数的表示范围 3. 数值稳定性处理方法核心思想数学推导 4. 代码实现分解代码与公式的对应关系 5. 具体数值示例示例:相似度矩阵方法1:直接计算exp(x)方法2&…...
查看linux中是否安装了tiktoken
在 Linux 中检查 tiktoken 是否安装的完整方法 通过 pip 命令检查 查看已安装的 Python 包列表: pip list | grep tiktoken 若输出包含 tiktoken,则表示已安装。 获取包详细信息: pip show tiktoken 若显示包版本、安装路径…...
从源码看无界 1.0.28:为何说它是 qiankun 的 “轻量化替代方案”(二)
我们接着上一节的《从源码看无界 1.0.28:为何说它是 qiankun 的 “轻量化替代方案”》内容继续往下。 生命周期图 sandbox.active 方法 我们找到 packages/wujie-core/src/sandbox.ts 文件的第 275 行: //.../** 激活子应用* 1、同步路由* 2、动态修改iframe的fetch* 3、准…...
SQL注入之时间盲注攻击流程详解
目录 一、时间盲注原理 二、完整攻击流程 1. 注入点确认 2. 基础条件判断 3. 系统信息收集 (1)获取数据库版本 (2)获取当前数据库名 4. 数据提取技术 (1)表名枚举 (2)列名猜…...
【NIO番外篇】之组件 Selector
目录 一、Selector:网络世界的“机场管制塔” / “总机接线员” 📡什么是 Selector?它的作用是什么? 二、Selector 的工作流程:塔台是怎么指挥飞机的?1. 飞机就位 (准备 Channel):2. 向塔台报到…...
对接印度尼西亚股票数据源API
随着对东南亚市场的关注增加,获取印度尼西亚(IDX)股票市场的实时和历史数据变得尤为重要。本文将指导您如何使用Spring Boot框架对接一个假定的印尼股票数据源API(例如,StockTV),以便开发者能够…...
SQL(9):创建数据库,表,简单
1、创建数据库,一句SQL语句搞定 CREATE DATDBASE 数据库名 CREATE DATABASE my_db;2、创建表 CREATE TABLE 表名(字段名 类型) CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255)…...
医学成像中的对比语言-图像预训练模型(CLIP):一项综述|文献速递-深度学习医疗AI最新文献
Title 题目 CLIP in medical imaging: A survey 医学成像中的对比语言-图像预训练模型(CLIP):一项综述 01 文献速递介绍 尽管在过去十年中视觉智能领域取得了重大进展(何恺明等人,2016;塔尔瓦宁和瓦尔…...
KEGG注释脚本kofam2kegg.py--脚本010
采用kofam结合kegg官网htxt进行注释 用法: python kofam2kegg.py kofam.out ath00001.keg my_kegg_output code: import sys from collections import defaultdictdef parse_kofam_file(kofam_file):ko_to_genes defaultdict(list)with open(kofam_file) as f:…...
hevc编码芯片学习-VLSI实现
在Fan等工作中,根据特定算法设计了整像素运动估计引擎,最终的BD-Rate损失非常小,但是硬件开销比较大,搜索算法缺少灵活性,本次设计优化了硬件设计架构, 微代码 取像素 压缩 水平参考像素存储器 寻址控制 转…...
选导师原理
总述 一句话总结:是雷一定要避,好的一定要抢。方向契合最好,不契合适当取舍。 首先明确自身需求: 我要学东西!青年导师,好沟通,有冲劲,高压力。 我要摆烂!中老年男性教…...
2.5亿像素卷帘快门CMOS大幅面扫描相机
规格说明书 主要特征 ◎ 卷帘快门CMOS 传感器 ◎ 2.46 亿像素分辨率 ◎ 全分辨率最高帧率达5fps ◎ 高灵敏度及低噪声 ◎ ROI 区域设置 ◎ 曝光时间灵活控制(外触发,自由运行) ◎ 输出像素格式8/10/12bit 可选 ◎ 自动坏像素校正、平场校正…...
CD27.【C++ Dev】类和对象(18)友元和内部类
目录 1.友元 友元函数 几个特点 友元类 格式 代码示例 2.内部类(了解即可) 计算有内部类的类的大小 分析 注意:内部类不能直接定义 内部类是外部类的友元类 3.练习 承接CD21.【C Dev】类和对象(12) 流插入运算符的重载文章 1.友元 友元函数 在CD21.【C Dev】类和…...
企业级硬盘的测试流程
测试硬盘流程 找一个有Linux操作系统的服务器,配置好管理ip的接口,连接上linux服务器,执行lsblk命令来查看设备的情况 使用mkfs命令格式化要测试的硬盘,格式化之前务必把数据进行备份,可以使用blkid命令查看硬盘的文件…...
std::enable_shared_from_this 模板类的作用是什么?
我们以Connection类的shared智能指针为例说明,std::enable_shared_from_this<Connection> 是一个标准库模板类,它的作用是让一个类的对象能够安全地生成指向自身的 std::shared_ptr,即使该对象最初是通过普通指针或其他方式创建的。 作…...
鸿蒙开发-ArkUi控件使用
2.0控件-按钮 2.1.控件-文本框 Text(this.message).fontSize(40) // 设置文本的文字大小.fontWeight(FontWeight.Bolder) // 设置文本的粗细.fontColor(Color.Red) // 设置文本的颜色------------------------------------------------------------------------- //设置边框Tex…...
大数据学习栈记——MongoDB编程
本文介绍NoSQL技术:MongoDB用Java来连接数据库,执行常见的数据库操作,使用环境:IntelliJ IDEA、Ubuntu24.04。 配置Maven 我们需要使用“MongoDB Driver”,所以先打开“MongoDB Java Driver”项目,但是提…...
体系结构论文(六十七):A Machine-Learning-Guided Framework for Fault-Tolerant DNNs
A Machine-Learning-Guided Framework for Fault-Tolerant DNNs DATE 2024 研究动机 深度神经网络(DNN)虽然对某些扰动具有天然的容错性,但在面对硬件故障(如软错误、老化、环境干扰等)时,仍会出现输出错…...
qt designer 创建窗体选择哪种屏幕大小
1. 新建窗体时选择QVGA还是VGA 下面这个图展示了区别 这里我还是选择默认,因为没有特殊需求,只是在PC端使用...
游戏引擎学习第225天
只能说太难了 回顾当前的进度 我们正在进行一个完整游戏的开发,并在直播中同步推进。上周我们刚刚完成了过场动画系统的初步实现,把开场动画基本拼接完成,整体效果非常流畅。看到动画顺利呈现,令人十分满意,整个系统…...
sql工具怎么选最适合自己的?
sql工具怎么选? 为什么大多数主流工具又贵又难用?有没有一款免费好用的sql工具?像大多数朋友经常用的sql工具应该都遇到过这种情况,用着用着收到了来自品牌方的律师函,或者处理数据时经常卡死,再或者不支持…...
css实现一键换肤
实现一键换肤的时候,我们除了动态替换引用的css文件,还可以通过使用css变量的方式,达到所需效果。 首先我们来了解css变量,css变量以--开头,引用时va(--变量名),例 :root{--default-color: #fff; } .box{b…...
波束形成(BF)从算法仿真到工程源码实现-第八节-波束图
一、概述 本节对MVDR、LCMV、LMS等算法的波束图进行仿真。 二、MVDR代码仿真 2.1 mvdr代码 clc; clear; M 18; % 天线数 lambda 10; d lambda / 2; L 100; %快拍数 thetas [10]; % 期望信号入射角度 thetai [-30 30]; % 干扰入射角度 n [0:M-1]; vs exp(-1j * 2…...
静态代码深度扫描详解
静态代码深度扫描是一种通过分析源代码结构、语法、语义及潜在逻辑,在不运行程序的情况下全面检测代码缺陷、安全漏洞和质量问题的技术。它通过结合数据流分析、控制流分析、符号执行等高级技术,实现对代码的深度理解,帮助开发团队在早期发现…...
LC25. K 个一组翻转链表(自己用)
25. K 个一组翻转链表 Java代码: 思路:利用虚拟头节点结合反转链表实现 Code: class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode dummy new ListNode(0);if (head null || k 1)return head;ListNode…...
Spring事务同步器在金融系统中的应用:从风控计算到交易投递
一句话总结 通过 TransactionSynchronization 机制,成功将投行交易系统的可靠性提升至金融级要求,并在对公贷款风控中实现高效资源管理。未来,事务管理将不仅仅是“提交”与“回滚”的二元选择,而是向智能化、实时化演进的核心基础设施。 1. 架构设计 1.1 整体架构图 2.…...
sealos跳转到cusor安装出错
第一次打开cursor安装出错怎么办 我出现这个问题的解决方式是重新下载并且切换目录解决...
【CUDA 】第3章 CUDA执行模型——3.5循环展开(1)
CUDA C编程笔记 第三章 CUDA执行模型3.5 循环展开3.5.1 展开的规约 待解决的问题: 第三章 CUDA执行模型 3.5 循环展开 循环展开是一种循环优化的技术,通过减少分支出现频率循环维护指令。 循环主体代码被多次编写,任何封闭的循环可以把迭代…...
AndroidStudio编译报错 Duplicate class kotlin
具体的编译报错信息如下: Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21) D…...
LeetCode hot 100—搜索二维矩阵
题目 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 fa…...
栈与队列习题分享(精写)
最小栈 题解 一、题目描述 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素 val 推入堆栈。 void pop() 删除堆栈顶部的元素。 int…...
Kotlin 集合过滤全指南:all、any、filter 及高级用法
在 Kotlin 中,集合过滤是数据处理的核心操作之一。无论是简单的条件筛选,还是复杂的多条件组合,Kotlin 都提供了丰富的 API。本文将详细介绍 filter、all、any、none 等操作符的用法,并展示如何在实际开发中灵活运用它们。 1. 基础…...
【lerobot】3-开源SO-100 主从臂的舵机位置校正、遥控操作(ubuntu系统)
官方从零教程:https://github.com/huggingface/lerobot/blob/main/examples/10_use_so100.md 8-lerobot aloha装配完毕如何进行遥操作 需要先完成的 组装好了so-100 2个机械臂下载安装了lerobot的代码环境:固定好主从臂,通过usb链接到同一个…...
影刀RPA证书题库包含初级、中级、高级和AP初级
影刀rpa初级证书选择题答案,影刀证书答案,影刀rpa考试,影刀初级考试,影刀初级考试选择题 原因 以前的在线题库https://exam.ezrpa.store/是为了方便更新题目和使用的,但经过实际使用发现大部分人“不会用”࿱…...
LR(0)
LR0就是当我处在自动机为红色这些结束状态的时候,这些红色状态就代表我们识别到了一个句柄,那现在的问题就是识别到了句柄,那要不要对他进行归约?LR0就是我不管当前指针指向的终结符是什么,我都拿它做规约 这里的二号状…...
基于 Python 和 OpenCV 技术的疲劳驾驶检测系统(2.0 全新升级,附源码)
大家好,我是徐师兄,一个有着7年大厂经验的程序员,也是一名热衷于分享干货的技术爱好者。平时我在 CSDN、掘金、华为云、阿里云和 InfoQ 等平台分享我的心得体会。 🍅文末获取源码联系🍅 2025年最全的计算机软件毕业设计…...
Matplotlib库详解
Matplotlib 是 Python 里一个特别常用的绘图库,它能帮你创建各种各样的可视化图形,像折线图、柱状图、散点图等。对于数据可视化、数据分析和科学研究而言,它是非常重要的工具。接下来我会以初学者的视角,为你详细介绍 Matplotlib…...
daz dForce to UE 的原理分析
dForce是物理模拟,不是关键帧动画: dForce是一个物理引擎。当你运行模拟时,Daz Studio会根据你设置的物理属性(如裙子的重量、布料的硬度、摩擦力)、环境因素(如重力、风力)以及与角色的碰撞&am…...
速卖通商品详情API接口:功能、应用与开发指南
前言 在全球跨境电商蓬勃发展的背景下,速卖通(AliExpress)作为阿里巴巴旗下的国际电商平台,凭借丰富的商品种类和庞大的用户群体,成为众多商家和开发者拓展海外市场的首选平台。为了满足商家和开发者对商品数据的深度…...
4月14日星期一今日早报简报微语报早读
4月14日星期一,农历三月十七,早报#微语早读。 1、全国田径大奖赛接力摘金,苏炳添的传奇将延续至全运会; 2、中国红基会:2024年全年总收支12.85亿元; 3、我国2025年电影总票房已突破250亿 位居全球第一&a…...
快速排序(非递归版本)
引言 在排序算法的世界里,快速排序以其高效的性能脱颖而出。它采用分治法的思想,通过选择基准元素将数组分为两部分,递归地对左右两部分进行排序。然而,递归实现的快速排序在处理大规模数据时可能会导致栈溢出的问题。为了解决这…...
Ubuntu20.04 设置开机自启
参考: Ubuntu20.04 设置开机自启_ubuntu进bos系统-CSDN博客...
添加登录和注册功能
先写前端再写后端 前提:ideavue3mybatisspringBoot3前后端分离实现对一张表的增删改查(完整代码版)-CSDN博客 项目地址 1.添加一个Login.vue视图 <template><div class"login_container"><div class"login…...
弱口令爆破
1.简单介绍 弱口令是指一些简单易猜的密码,可通过社工方式和一些爆破工具进行破解,以下介绍一款爆破工具的用法。burpsuite简称BP,一款可以利用字典破解账户密码的工具。 2.部署网站 可以使用PHPstudy的Apache服务,也可以使用I…...
springboot调用python文件,在ubuntu上部署,踩坑之旅(已部署成功)
项目介绍 springboot 调用python文件,python调用另一个数据文件,然后计算出结果,看似简单,实际上有很多坑,因为涉及到python的三方库,有时候下载不下来,有时候版本不匹配,折腾了好久…...
Android studio消息同步机制:消息本地存储,服务器交互减压
文章目录 后端(Flask)代码前端(Android Studio Java)代码 消息同步机制: 手机端可以将消息存储在本地数据库中,减少与服务器的交互压力。同时,通过序列号机制,手机端可以与服务器同步消息&#…...
前端常用组件库全览与推荐
📌 一、组件库生态全景图 🚀 二、React 生态组件库推荐 名称简介官网Ant Design阿里出品,企业级 UI 系统,设计规范完整,适合后台系统https://ant.designMaterial UIGoogle Material Design 实现,样式响应式…...
视觉算法+雾炮联动:开创智能降尘新时代
在许多工业环境中,尤其是那些涉及大量物料搬运和处理的地方,如工厂或仓库,扬尘问题是一个普遍存在的挑战。这不仅影响了工作人员的工作条件,还可能构成健康和安全隐患。为了改善这一状况,不少业主采用了物理方法来减少…...
【Pandas】pandas DataFrame items
Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签(行标签和列标签&#…...
易境通WMS系统代理仓解决方案:让代理仓管理无后顾之忧!
易境通WMS系统代理仓解决方案:让代理仓管理无后顾之忧! 对于海外仓企业而言,除了自有仓库外,为了业务发展还会同时代理其他仓库,于是经常会面临主仓代理仓数据同步问题及费用问题。此外,由于个仓库分布较广…...