当前位置: 首页 > news >正文

PyTorch 中 coalesce() 函数详解与应用示例

PyTorch 中 coalesce() 函数详解与应用示例

coalesce: 美 [ˌkoʊəˈlɛs] 合并;凝聚;联结,注意发音

引言

在 PyTorch 中,稀疏张量(Sparse Tensor)是一种高效存储和操作稀疏数据的方式。稀疏张量主要用于需要处理大量零元素的场景,例如图神经网络(GNN)和大型矩阵操作。本文将深入解析 coalesce() 函数的用法,并结合代码示例进行演示。

coalesce() 函数简介

coalesce() 是 PyTorch 稀疏张量的一个成员函数,主要用于去重和合并重复索引的元素。在稀疏张量中,可能存在重复的坐标位置,coalesce() 可以将这些重复的坐标进行合并,并对相同索引的值进行累加。

语法

sparse_tensor.coalesce()

功能

  • 去重合并索引:将具有重复索引的元素合并为一个,值相加。
  • 输出稀疏张量:返回新的 coalesced 稀疏张量,减少存储开销并优化计算效率。

使用示例

基本示例

import torch# 创建一个稀疏张量
indices = torch.tensor([[0, 1, 1], [2, 0, 0]])  # 表示坐标
values = torch.tensor([3.0, 4.0, 5.0])        # 对应值
sparse_tensor = torch.sparse_coo_tensor(indices, values, (2, 3))print("未合并之前:")
print(sparse_tensor)# 使用 coalesce() 合并重复索引
coalesced_tensor = sparse_tensor.coalesce()print("合并之后:")
print(coalesced_tensor)

输出结果:

未合并之前:
tensor(indices=tensor([[0, 1, 1],[2, 0, 0]]),values=tensor([3., 4., 5.]),size=(2, 3), nnz=3, layout=torch.sparse_coo)
合并之后:
tensor(indices=tensor([[0, 1],[2, 0]]),values=tensor([3., 9.]),size=(2, 3), nnz=2, layout=torch.sparse_coo)

可以看到,坐标 [1, 0] 重复出现了两次,值 4.05.0 被合并成了 9.0

这个例子的具体解析如下

在这个例子中,indicesvalues 用来创建一个稀疏张量,表示了一个 2x3 的张量。下面逐步解释如何合并重复的索引,并解释每个元素的含义。

初始稀疏张量:

indices = torch.tensor([[0, 1, 1], [2, 0, 0]])  
values = torch.tensor([3.0, 4.0, 5.0])

indices 表示张量中非零元素的坐标,每一列表示一个非零元素的坐标:

  • 第一列 [0, 2] 代表位置 (0, 2),即第一行第三列。
  • 第二列 [1, 0] 代表位置 (1, 0),即第二行第一列。
  • 第三列 [1, 0] 代表位置 (1, 0),即第二行第一列。

values 是这些坐标位置对应的值:

  • 位置 (0, 2) 的值是 3.0。
  • 位置 (1, 0) 的值是 4.0。
  • 位置 (1, 0) 的值是 5.0。

因此,张量的稀疏表示为:

[[0, 0, 3.0],[4.0 + 5.0, 0, 0]]

也就是说,第二行的第一列包含两个非零元素:4.0 和 5.0。

使用 coalesce() 合并重复索引:

coalesced_tensor = sparse_tensor.coalesce()

coalesce() 会合并重复的索引,并将它们的值相加。具体地:

  • 对于位置 (1, 0),它有两个非零值 4.0 和 5.0,因此它们会被合并为 9.0。
  • 位置 (0, 2) 保持为 3.0,因为它是唯一的非零元素。

所以,合并之后的张量变为:

[[0, 0, 3.0],[9.0, 0, 0]]

合并后的稀疏张量:

tensor(indices=tensor([[0, 1],[2, 0]]),values=tensor([3., 9.]),size=(2, 3), nnz=2, layout=torch.sparse_coo)
  • indices 表示合并后的非零元素的坐标。只有两个非零元素:一个位于 (0, 2),另一个位于 (1, 0)。
  • values 表示这些坐标位置的值:3.0 和 9.0。
  • nnz=2 表示非零元素的数量(合并后的张量有两个非零元素)。

总结:
合并后的稀疏张量仍然是一个 2x3 张量,但是它去掉了重复的索引,并将重复索引位置的值进行了求和。

用于 FP16 梯度处理

在混合精度训练(AMP)中,如果需要处理 FP16 精度的稀疏梯度,可能会遇到重复索引问题。例如,在分布式训练中累积梯度时,需要确保梯度不会因为重复索引而导致计算错误。因此,我们可以利用 coalesce() 来合并梯度。

以下是一个示例代码片段:

import torch# 模拟 FP16 的稀疏梯度
indices = torch.tensor([[0, 1, 1], [2, 0, 0]])
values = torch.tensor([0.5, 0.25, 0.25], dtype=torch.float16)
grad = torch.sparse_coo_tensor(indices, values, (2, 3), dtype=torch.float16)# 合并梯度
if grad.dtype == torch.float16:grad = grad.coalesce()print(grad)

输出结果:

tensor(indices=tensor([[0, 1],[2, 0]]),values=tensor([0.5000, 0.5000], dtype=torch.float16),size=(2, 3), nnz=2, layout=torch.sparse_coo)

在 AMP 训练过程中,这种操作确保梯度不会因为浮点精度或重复索引导致数值错误。

高级用法

1. 检查是否已合并

可以使用 is_coalesced() 函数检查稀疏张量是否已合并:

if not grad.is_coalesced():grad = grad.coalesce()

2. 支持更高维度操作

coalesce() 也支持高维稀疏张量。例如:

indices = torch.tensor([[0, 1, 1, 2], [2, 0, 0, 1], [1, 2, 2, 3]])
values = torch.tensor([1.0, 2.0, 3.0, 4.0])
sparse_tensor = torch.sparse_coo_tensor(indices, values, (3, 3, 4))
coalesced_tensor = sparse_tensor.coalesce()
print(coalesced_tensor)

Output

tensor(indices=tensor([[0, 1, 2],[2, 0, 1],[1, 2, 3]]),values=tensor([1., 5., 4.]),size=(3, 3, 4), nnz=3, layout=torch.sparse_coo)
分析这个稀疏张量的情况

稀疏张量的构建与合并过程:
indices 解析:

indices 是一个 3x4 的张量,表示四个非零元素的坐标。每一列代表一个坐标,分别是:

  • 第一列 [0, 2, 1],表示位置 (0, 2, 1),即第一维索引 0,第二维索引 2,第三维索引 1。
  • 第二列 [1, 0, 2],表示位置 (1, 0, 2),即第一维索引 1,第二维索引 0,第三维索引 2。
  • 第三列 [1, 0, 2],表示位置 (1, 0, 2),即第一维索引 1,第二维索引 0,第三维索引 2。
  • 第四列 [2, 1, 3],表示位置 (2, 1, 3),即第一维索引 2,第二维索引 1,第三维索引 3。

values 解析:

values 是一个长度为 4 的张量,表示在上述位置的值:

  • 位置 (0, 2, 1) 的值为 1.0。
  • 位置 (1, 0, 2) 的值为 2.0。
  • 位置 (1, 0, 2) 的值为 3.0。
  • 位置 (2, 1, 3) 的值为 4.0。

创建的稀疏张量:

稀疏张量的维度为 (3, 3, 4),并且非零元素位于:

  • 位置 (0, 2, 1) 为 1.0。
  • 位置 (1, 0, 2) 为 2.0。
  • 位置 (1, 0, 2) 为 3.0(同样位置的两个值合并)。
  • 位置 (2, 1, 3) 为 4.0。

使用 coalesce() 合并重复索引:

当调用 coalesce() 时,它会合并相同坐标上的值,将它们相加。因此,位置 (1, 0, 2) 的值 2.0 和 3.0 会合并为 5.0。

合并后的非零位置和值:

  • 位置 (0, 2, 1) 的值为 1.0。
  • 位置 (1, 0, 2) 的值为 5.0(2.0 + 3.0)。
  • 位置 (2, 1, 3) 的值为 4.0。

输出整个张量:

现在我们可以构造一个完整的张量,其中非零位置的值已经被填充,而其他位置仍然是零。结果应为:

[[[ 0, 0, 0, 0],[ 0, 0, 0, 0],[ 0, 1, 0, 0]],[[ 0, 0, 5, 0],[ 0, 0, 0, 0],[ 0, 0, 0, 0]],[[ 0, 0, 0, 0],[ 0, 0, 0, 4],[ 0, 0, 0, 0]]]

解释:

  • 位置 (0, 2, 1) 的值是 1.0。
  • 位置 (1, 0, 2) 的值是 5.0(合并了 2.0 和 3.0)。
  • 位置 (2, 1, 3) 的值是 4.0。
  • 其他位置都为零。

因此,最终的输出张量是:

[[[ 0, 0, 0, 0],[ 0, 0, 0, 0],[ 0, 1, 0, 0]],[[ 0, 0, 5, 0],[ 0, 0, 0, 0],[ 0, 0, 0, 0]],[[ 0, 0, 0, 0],[ 0, 0, 0, 4],[ 0, 0, 0, 0]]]

这个结果就是在合并重复索引后得到的稀疏张量。

3. 在优化器中的应用

在梯度缩放优化器中,我们可以利用 coalesce() 保持梯度一致性:

for param in model.parameters():if param.grad is not None and param.grad.is_sparse:param.grad = param.grad.coalesce()
具体解释

在优化器中的应用中,coalesce() 的作用是在稀疏梯度(例如,在使用稀疏参数或稀疏更新的模型时)中合并相同位置上的梯度,以确保梯度的一致性。特别是在分布式训练或使用梯度累积时,多个梯度更新可能会产生相同位置上的不同梯度值。在这种情况下,调用 coalesce() 可以将相同位置的梯度值合并(加和),防止在更新参数时重复计算,从而提高训练效率并避免梯度值不一致。

具体应用场景:
在训练过程中,当某些参数的梯度是稀疏的(即只有少数位置的梯度非零),如果在多个阶段对这些位置进行更新,可能会出现多个梯度值对同一位置进行计算。此时,我们希望对相同位置的梯度值进行合并,以保证这些位置的最终梯度是正确的。这通常发生在使用稀疏矩阵操作时(如稀疏优化器、稀疏神经网络)。

通过调用 coalesce(),我们可以确保相同位置的梯度值加和到一起,避免因为重复计算导致的不一致问题。

数值模拟:
假设我们有一个包含两个参数的模型,且它们的梯度是稀疏的。我们将模拟以下场景:

  1. 初始稀疏梯度:设定一个稀疏梯度,并模拟两个步骤的梯度更新。
  2. 梯度合并前:在两个步骤中,我们对相同位置的参数更新了不同的梯度值。
  3. 梯度合并后:使用 coalesce() 合并相同位置的梯度。
import torch# 假设模型有2个参数,每个参数的梯度是稀疏的
# 初始梯度
indices = torch.tensor([[0, 1], [1, 0]])  # 表示在位置 (0, 1) 和 (1, 0) 上有梯度
values = torch.tensor([1.0, 2.0])  # 对应位置的梯度
sparse_grad = torch.sparse_coo_tensor(indices, values, (2, 2))# 输出初始稀疏梯度
print("初始稀疏梯度:")
print(sparse_grad)# 模拟第二次更新,更新相同位置
indices_new = torch.tensor([[0, 1], [1, 0]])  # 仍然是相同的位置
values_new = torch.tensor([3.0, 4.0])  # 对应位置新的梯度
sparse_grad_new = torch.sparse_coo_tensor(indices_new, values_new, (2, 2))# 合并梯度
combined_grad = sparse_grad + sparse_grad_new  # 两个稀疏梯度相加# 合并后的稀疏梯度
print("\n合并前的稀疏梯度:")
print(combined_grad)# 使用 coalesce() 合并相同位置的梯度
coalesced_grad = combined_grad.coalesce()# 合并后的稀疏梯度
print("\n合并后的稀疏梯度:")
print(coalesced_grad)

解释:

  1. 初始梯度
    我们定义了一个稀疏梯度 sparse_grad,它在位置 (0, 1)(1, 0) 具有梯度值 1.0 和 2.0。

  2. 第二次更新
    模拟了一个新的稀疏梯度 sparse_grad_new,其中位置 (0, 1)(1, 0) 的梯度分别更新为 3.0 和 4.0。

  3. 合并梯度
    在合并两个稀疏梯度时,直接将它们相加,得到 combined_grad。此时,两个位置上的梯度被简单地加在一起,得到的梯度分别是 4.0(1.0 + 3.0)和 6.0(2.0 + 4.0)。

  4. 梯度合并(coalesce)
    使用 coalesce() 方法后,任何相同位置的梯度会被合并。由于我们的梯度已经在上一步合并,coalesce() 会确保这些位置的梯度值是正确的。如果存在重复的索引,coalesce() 会将它们的值加和。

输出:

初始稀疏梯度:
tensor(indices=tensor([[0, 1],[1, 0]]),values=tensor([1., 2.]),size=(2, 2), nnz=2, layout=torch.sparse_coo)合并前的稀疏梯度:
tensor(indices=tensor([[0, 1],[1, 0]]),values=tensor([4., 6.]),size=(2, 2), nnz=2, layout=torch.sparse_coo)合并后的稀疏梯度:
tensor(indices=tensor([[0, 1],[1, 0]]),values=tensor([4., 6.]),size=(2, 2), nnz=2, layout=torch.sparse_coo)

结论:

  1. 合并前:我们看到 combined_grad 中相同位置的梯度已经进行了加法操作,但这只是简单的相加,并没有执行任何额外的合并操作。
  2. 合并后:由于 coalesce() 会将相同位置的梯度加和,这个操作确保了梯度在同一位置的值是一致的,避免了重复的更新。

通过这种方式,coalesce() 可以有效地帮助我们在稀疏梯度中保持一致性,确保在更新模型参数时不会出现梯度冲突或不一致的情况。

注意事项

  1. 自动合并限制:某些 PyTorch 操作可能不会自动对稀疏张量进行合并,因此需要手动调用 coalesce()
  2. 内存优化:在大规模稀疏矩阵计算中,合并操作有助于减少内存开销,提高计算效率。
  3. 不可逆操作coalesce() 会生成新的张量,如果需要保留原始数据,需提前备份。

结论

coalesce() 是处理稀疏张量中重复索引的重要工具,尤其适合需要处理混合精度训练的梯度更新场景。通过上述示例和应用场景,希望读者对该函数有更深入的理解,并能在实际项目中灵活应用。

后记

2025年1月2日19点29分于上海,在GPT4o mini的辅助下完成。

相关文章:

PyTorch 中 coalesce() 函数详解与应用示例

PyTorch 中 coalesce() 函数详解与应用示例 coalesce: 美 [ˌkoʊəˈlɛs] 合并;凝聚;联结,注意发音 引言 在 PyTorch 中,稀疏张量(Sparse Tensor)是一种高效存储和操作稀疏数据的方式。稀疏…...

计算机网络(第8版)第3章课后习题--透明传输

【3-11】 试分别讨论以下各种情况在什么条件下是透明传输,在什么条件下不是透明传 输。(提示:请弄清什么是“透明传输”,然后考虑能否满足其条件。) (1)普通的电话通信。 (2)互联网提供的电子邮件服务。 解 答 : 透明传输是指在数据传输…...

JavaScript 日期格式

在 JavaScript 中,日期格式可以通过 Date 对象进行操作和格式化。下面是一些常见的 JavaScript 日期格式及其示例: 1. ISO 8601 格式 ISO 8601 是一种标准的日期和时间表示方法,格式为 YYYY-MM-DDTHH:mm:ss.sssZ,例如: let date = new Date(); console.log(date.toISOS…...

云打印之拼多多打印组件交互协议

拼多多打印组件交互协议相关介绍如下: 1、打印组件下载地址 http://meta.pinduoduo.com/api/one/app/v1/lateststable?appIdcom.xunmeng.pddprint&platformwindows&subTypemain 2、socket连接端口 如果是http的话,端口是5000 socket new …...

Oracle数据库如何找到 Top Hard Parsing SQL 语句?

有一个数据库应用程序存在过多的解析问题,因此需要找到产生大量硬解析的主要语句。 什么是硬解析 Oracle数据库中的硬解析(Hard Parse)是指在执行SQL语句时,数据库需要重新解析该SQL语句,并创建新的执行计划的过程。这…...

浅谈棋牌游戏开发流程二:后端技术选型与基础环境搭建

一、前言:客户端只是台前,后端才是幕后“指挥中心” 在上一篇“客户端技术”中,我们聊到玩家看到的一切动作、动画、界面逻辑,都靠客户端去渲染和交互。但若没有后端的支撑,玩家点了“出牌”可能就像一拳打在空气里—…...

使用qiankun搭建微前端应用及踩坑

线上演示地址:React App 源码地址:https://github.com/Jiang-K-J/micro-app?tabreadme-ov-file (帮忙点个小星星) 主应用:react 18 子应用:vite vue3 子应用:react 18 安装 主应用 $ y…...

Windows 环境配置 HTTPS 服务实战

一、 环境准备 win10以上操作系统安装 Certbot申请阿里云\腾讯云域名安装 nginx 1.3以上版本 二、Certbot 安装及 SSL 证书生成 Certbot 是一个免费、开源工具,用于自动化在Web服务器上获取和更新SSL/TLS证书。它可以通过Let’s Encrypt服务获取免费的SSL/TLS证书…...

小程序租赁系统开发的优势与应用前景分析

内容概要 小程序租赁系统是一种新兴的数字化解决方案,旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能,如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好,让用户能够轻松选择所需的商品或服务&…...

Redis(基础篇 + 实践篇 )

01 | 基本架构:一个键值数据库包含什么? Redis 作为一个内存数据存储系统,它的架构设计非常简洁,但功能非常强大。理解其核心架构对高效使用 Redis 至关重要。 客户端与服务器架构: 客户端通过 TCP 协议连接到 Redis …...

单片机-独立按键矩阵按键实验

1、按键介绍 按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态, 如果按键按下,初始导通状态变为断开,初始断开状态变为导通 我们开发板是采用软件消抖,一般来说一个简单的按键消抖就是先读取按键的状…...

我用AI学Android Jetpack Compose之入门篇(1)

这篇我们先来跑通第一个Android Jetpack Compose工程,现在新版本的Android Studio,新建工程选择Empty Activity默认就会开启Jetpack Compose的支持,再次声明,答案来自 通义千问Ai 文章目录 1.用Android Jetpack Compose需要安装什…...

简单的生产数据库重连策略优化

简单的druid生产数据库重连策略优化 1. 需求 我们生产环境有一次在大量请求拥堵后,好多数据库操作都超时了,在此之后数据库的连接池不能正常的获取数据库连接了,我们确认了数据库服务是没有问题的,那么就是连接池的配置有问题&a…...

STM32-笔记37-吸烟室管控系统项目

一、项目需求 1. 使用 mq-2 获取环境烟雾值,并显示在 LCD1602 上; 2. 按键修改阈值,并显示在 LCD1602 上; 3. 烟雾值超过阈值时,蜂鸣器长响,风扇打开;烟雾值小于阈值时,蜂鸣器不响…...

2025-01-04 Unity插件 YodaSheet1 —— 插件介绍

文章目录 1 介绍2 工作原理2.1 ScriptableObject -> YadeSheetData2.2 YadeDatabase 存储多个 YadeSheetData 3 用途4 缺点5 推荐 1 介绍 ​ Yade 提供类似于 Excel 或者 Google Sheets 的表格编辑器,可以轻松地在 Unity 编辑器中 编辑,搜索&#xf…...

电子电气架构 --- 安全相关内容汇总

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

科研绘图系列:R语言单细胞数据常见的可视化图形

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理图1图2图3图4图5图6系统信息参考介绍 单细胞数据常见的可视化图形 因为本教程是单细胞数据,因此运行本画图脚本需要电脑的内存最少32Gb 加载…...

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 2:基础知识

目录 1 预热1.1 记号1.2 分类器计算过载问题 2 多头编码(MHE)2.1 标签分解2.2 多头组合(Multi-Head Combination) 论文:Multi-Head Encoding for Extreme Label Classification 作者:Daojun Liang, Haixia …...

Flink使用

Window下启动支持 下载或复制老版本的放在bin目录下即可; flink.bat echo off setlocalSET bin%~dp0 SET FLINK_HOME%bin%.. SET FLINK_LIB_DIR%FLINK_HOME%\lib SET FLINK_PLUGINS_DIR%FLINK_HOME%\pluginsSET JVM_ARGS-Xmx512mSET FLINK_JM_CLASSPATH%FLINK_LI…...

一种可复用的AI提效方案:AI点灯

在当今飞速发展的时代,AI技术正不断渗透到我们生活的各个层面,深刻改变着传统的工作方式和生活模式。面对这一重大变革,我们不能被动观望或抗拒,而应积极拥抱AI,将其作为成长的助力。只有与AI协同发展,才能…...

Django 模型

Django 模型 Django 模型是 Django 框架的核心组件之一,它用于定义应用程序的数据结构。在 Django 中,模型是 Python 类,通常继承自 django.db.models.Model。每个模型类代表数据库中的一个表,模型类的属性对应表中的字段。 1. 创建模型 创建 Django 模型非常简单。首先…...

【MySQL 探索者日志 】第二弹 —— 数据库基础

MySQL系列学习笔记: MySQL探索者日志__Zwy的博客-CSDN博客 各位于晏,亦菲们,请点赞关注! 我的个人主页: _Zwy-CSDN博客 目录 1、MySQL服务器,数据库,表关系 2、MySQL登录连接服务器 3、MyS…...

【51单片机-零基础chapter1】

安装软件(配套的有,不多赘述) 1.管理员身份运行keil和破解软件kegen 将CID代码复制粘贴到 一定要管理员方式,不然会error 插入板子 我的电脑,管理 1.如果是拯救者,查看端口,如果没有则显示隐藏 2.苹果不知道,好像不可以 3.其他电脑在"其他设备找" (注:本人在校已…...

stm32的掉电检测机制——PVD

有时在一些应用中,我们需要检测系统是否掉电了,或者要在掉电的瞬间需要做一些处理。 STM32内部自带PVD功能,用于对MCU供电电压VDD进行监控。 STM32就有这样的掉电检测机制——PVD(Programmable Voltage Detecter),即可编程电压检…...

电脑steam api dll缺失了怎么办?

电脑故障解析与自救指南:Steam API DLL缺失问题的全面解析 在软件开发与电脑维护的广阔天地里,我们时常会遇到各种各样的系统报错与文件问题,其中“Steam API DLL缺失”便是让不少游戏爱好者和游戏开发者头疼的难题之一。作为一名深耕软件开…...

Kotlin 协程基础知识总结七 —— Flow 与 Jetpack Paging3

专题分为五大块: Paging3 的结构组成Flow 与 Paging3下拉刷新上拉刷新离奇 Bug上游数据缓存 Demo 会还原开发迭代的过程,不会直接一步到位。 1、Paging3 加载数据流程 (P105)Paging3 的简介详情可参考官方文档 Paging 库概览&…...

使用JMeter玩转tidb压测

作者: du拉松 原文来源: https://tidb.net/blog/3f1ada39 一、前言 tidb是mysql协议的,所以在使用过程中使用tidb的相关工具连接即可。因为jmeter是java开发的相关工具,直接使用mysql的jdbc驱动包即可。 二、linux下安装jmet…...

音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介

一、引言 本文对MPEG2-PS格式进行简介。 进行简介之前,请各位先下载MPEG2-PS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-PS的官方文档。但是ITU提供的文档是免费的,ISO/IEC是付费的,所以我们主要阅读ITU提供的官方文档,比如较新…...

ETCD渗透利用指南

目录 未指定使用put操作报错 未指定操作版本使用get报错 首先etcd分为两个版本v2和v3,不同的API结果无论是访问URL还是使用etcdctl进行通信,都会导致问题,例如使用etcdctl和v3进行通信,如果没有实名ETCDCTL_API3指定API版本会直接…...

Python安装(新手详细版)

前言 第一次接触Python,可能是爬虫或者是信息AI开发的小朋友,都说Python 语言简单,那么多学一些总是有好处的,下面从一个完全不懂的Python 的小白来安装Python 等一系列工作的记录,并且遇到的问题也会写出&#xff0c…...

SQL 中复杂 CASE WHEN 嵌套逻辑优化

目标:优化复杂的 CASE WHEN 逻辑,提升 SQL 语句的可读性与执行效率,减少多层嵌套带来的复杂性。 1. CASE WHEN 的常见问题 嵌套过深:多个条件判断嵌套,难以阅读和维护。重复逻辑:相似逻辑在多个分支中重复…...

【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)

原文链接:https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下,跨境电商行业正以前所未有的态势重塑国际贸易格局,成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》,…...

C# 设计模式(结构型模式):代理模式

C# 设计模式(结构型模式):代理模式 在软件开发中,有时我们需要通过某种方式间接地访问一个对象,这时就可以使用代理模式(Proxy Pattern)。代理模式通过引入一个代理对象来控制对目标对象的访问…...

单片机复位电路基本理解教程文章·含上拉电阻理解电容开路理解!!!

目录 常见复位电路种类 复位电路电阻上拉理解 电容储能断路理解 ​​​​​​​ ​​​​​​​ 编写不易,仅供学习,请勿搬运,感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路降压芯片驱动电路详解-…...

深入浅出:事件监听中的适配器模式

1. 为什么需要适配器模式? 在Java的事件监听器设计中,许多接口有多个抽象方法。例如,MouseListener 接口有 5 个方法,KeyListener 接口有 3 个方法。如果我们只关心其中的一个方法(例如,鼠标点击事件&…...

常用LabVIEW算法及应用

在LabVIEW项目中,算法的应用是提高系统性能、实现特定功能、完成复杂任务的核心。LabVIEW作为一种图形化编程语言,允许用户通过直观的图形编程来实现各种复杂的算法。这些算法广泛应用于控制系统、数据采集、信号处理、图像处理、机器学习等领域。了解常…...

VTK知识学习(28)-区域提取

1、感兴趣区域(Volume ofInterest,VOI) 它是图像内部的一块子区域。在VTK中,vtkExtractVOI 类可根据用户指定的区域范围提取子图像。该Filter 的输入和输出都是一个vtkImageData,因此其结果可以直接作为图像保存。 代码: private void Test…...

基于Spring Boot + Vue3实现的在线汽车保养维修预约管理系统源码+文档

前言 基于Spring Boot Vue3实现的在线汽车保养维修预约管理系统是一种前后端分离架构的应用,它结合了Java后端开发框架Spring Boot和现代JavaScript前端框架Vue.js 3.0的优势。这样的系统可以为汽车服务站提供一个高效的平台来管理客户的预约请求 技术选型 系统…...

CAN201 Introduction to Networking(计算机网络)Pt.4 链路层

文章目录 5. Link Layer(链路层)5.1 Services of link layer(链路层的服务)5.2 Error detection and correction(错误检测和纠正)5.2.1 Partity Checks(奇偶检验)5.2.2 Checksum&…...

Python视频处理:噪声矩阵与并行计算的完美融合

噪声级别对视频质量有显著的影响,主要体现在以下几个方面: 1. 视觉质量 低噪声级别:当噪声级别较低时,视频的视觉质量较好。噪声对图像细节的干扰较小,画面看起来较为清晰和自然。观众可以更容易地识别图像中的细节和…...

wordpress开发之实现使用第三方库qrcode-generator生成二维码并上传和展示

文章目录 一、需求二、技术实现 - 利用qrcode-generator库三、代码实现 一、需求 客户的需求是能将特定的url生成二维码,以便将二维码分享或贴到合同纸上给他的客户扫描查看信息。 这个url包含的内容类似于如下格式: https://www.example.com/contrac…...

计算机网络——物理层

一、通信基础 1.相关术语: • 数据(data)——运送消息的实体。 • 信号(signal)——数据的电气的或电磁的表现。 • “模拟的”(analogous)——代表消息的参数的取值是连续的。 • “数字的”(digital)——代表消息的参数的取值是离散的。 • 码元(code)——在…...

网络IP协议

IP(Internet Protocol,网际协议)是TCP/IP协议族中重要的协议,主要负责将数据包发送给目标主机。IP相当于OSI(图1)的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…...

Unity UGUI使用技巧与经验总结(不定期更新)

Text自动缩放参考连接: Unity -UGUI中Text文本框的自动调整,字体大小的自适应调节_unity添加的字体大小锁定-CSDN博客 Toggle按钮选择时,显示对应的UI界面: 为Toggle组件的On Value Change事件添加对需要显示的对象的SetActive…...

Tailwind CSS 使用简介

参考网站安装 - Tailwind CSS 中文网 号称是开始使用 Tailwind CSS 通过 npm 安装 tailwindcss,并创建你的 tailwind.config.js 文件。 npm install -D tailwindcss npx tailwindcss init 在 tailwind.config.js 文件中添加所有模板文件的路径。 /** type {im…...

嵌入式linux中socket控制与实现

一、概述 1、首先网络,一看到这个词,我们就会想到IP地址和端口号,那IP地址和端口各有什么作用呢? (1)IP地址如身份证一样,是标识的电脑的,一台电脑只有一个IP地址。 (2)端口提供了一种访问通道,服务器一般都是通过知名端口号来识别某个服务。例如,对于每个TCP/IP实…...

Go语言的 的数据封装(Data Encapsulation)核心知识

Go语言的数据封装(Data Encapsulation)核心知识 引言 在现代编程语言中,数据封装是一个重要的编程概念。它不仅帮助开发者管理复杂性,还提高了代码的可维护性和安全性。Go语言(Golang)作为一种注重简洁性…...

25/1/5 算法笔记<强化学习> MPC,交叉熵法,PETS算法

MPC 一个棋手下棋,会根据当前的局势来推演落子几步可能发生的局势,然后选择局势最好的一种情况来决定当前落子位置。 模型预测控制方法MPC,就是这样一种迭代的、基于模型的控制方法。值得注意的是MPC中不存在一个显示的策略。具体而言就是MPC在每次采取…...

最新版Chrome浏览器加载ActiveX控件之CFCA安全输入控件

背景 CFCA安全输入控件用于保证用户在浏览器、桌面客户端、移动客户端中输入信息的安全性,防止运行在用户系统上的病毒、木马等恶意程序入侵窃取用户输入的敏感信息。确保用户输入、本地缓存、网络传输整个流程中,输入的敏感信息不被窃取。广泛应用于银行…...

vue 项目集成 electron 和 electron 打包及环境配置

vue electron 开发桌面端应用 安装 electron npm i electron -D记得加上-D,electron 需添加到devDependencies,如果添加到dependencies后面运行可能会报错 根目录创建electron文件夹,在electron文件夹创建main.js(或者backgrou…...