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

图解多头注意力机制:维度变化一镜到底



一、多头注意力机制概述

多头注意力(Multi-Head Attention)是Transformer模型的核心组件,其核心思想是通过 ‌并行处理多个子空间‌ 来捕捉序列中不同位置间的复杂依赖关系。主要特点:

  • 并行计算:将高维向量拆分为多个低维子空间
  • 多视角学习:每个注意力头关注不同特征模式
  • 高效性:矩阵运算高度可并行化

在这里插入图片描述

二、代码实现

1. pyTorch 实现
import math
import torch
import torch.nn as nn
import torch.nn.functional as Fclass MultiHeadAttention(nn.Module):def __init__(self, embed_dim, num_heads):"""Args:embed_dim: 词向量维度(如512)num_heads: 注意力头数量(如8)"""super().__init__()self.embed_dim = embed_dimself.num_heads = num_headsself.head_dim = embed_dim // num_heads  # 每个头的维度(如512//8=64)assert self.head_dim * num_heads == embed_dim, "维度不可整除"# 定义线性变换层self.query = nn.Linear(embed_dim, embed_dim)  # Q矩阵self.key = nn.Linear(embed_dim, embed_dim)    # K矩阵self.value = nn.Linear(embed_dim, embed_dim)  # V矩阵self.out = nn.Linear(embed_dim, embed_dim)    # 输出层def transpose_for_scores(self, x):"""拆分多头并调整维度顺序输入: [batch_size, seq_len, embed_dim]输出: [batch_size, num_heads, seq_len, head_dim]"""new_shape = x.size()[:-1] + (self.num_heads, self.head_dim)x = x.view(*new_shape)  # 新增头维度return x.permute(0, 2, 1, 3)  # [batch, heads, seq_len, head_dim]def forward(self, query, key, value, mask=None):"""前向传播流程输入形状: [batch_size, seq_len, embed_dim]输出形状: [batch_size, seq_len, embed_dim]"""batch_size = query.size(0)# 1. 线性变换Q = self.query(query)  # [N, seq, D]K = self.key(key)      # [N, seq, D]V = self.value(value)  # [N, seq, D]# 2. 拆分多头Q = self.transpose_for_scores(Q)  # [N, h, seq, d]K = self.transpose_for_scores(K)  # [N, h, seq, d] V = self.transpose_for_scores(V)  # [N, h, seq, d]# 3. 计算注意力分数scores = torch.matmul(Q, K.transpose(-2, -1))  # [N, h, seq_q, seq_k]scores /= math.sqrt(self.head_dim)  # 缩放# 4. 应用掩码(可选)if mask is not None:scores = scores.masked_fill(mask == 0, -1e9)# 5. 计算注意力权重attn_weights = F.softmax(scores, dim=-1)  # [N, h, seq_q, seq_k]# 6. 应用权重到Valueout = torch.matmul(attn_weights, V)  # [N, h, seq_q, d]# 7. 合并多头out = out.permute(0, 2, 1, 3).contiguous()  # [N, seq_q, h, d]out = out.view(batch_size, -1, self.embed_dim)  # [N, seq, D]# 8. 输出层return self.out(out), attn_weights
2. tensorFlow实现
# TensorFlow (兼容TF2.x)import tensorflow as tf
from tensorflow.keras.layers import Layer, Denseclass MultiHeadAttention(Layer):def __init__(self, embed_dim, num_heads):"""Args:embed_dim: 词向量维度(如512)num_heads: 注意力头数量(如8)"""super(MultiHeadAttention, self).__init__()self.embed_dim = embed_dimself.num_heads = num_headsself.head_dim = embed_dim // num_headsassert self.head_dim * num_heads == embed_dim, "维度不可整除"# 定义线性变换层self.query_dense = Dense(embed_dim)self.key_dense = Dense(embed_dim)self.value_dense = Dense(embed_dim)self.output_dense = Dense(embed_dim)def split_heads(self, x, batch_size):"""拆分多头并调整维度顺序输入: [batch_size, seq_len, embed_dim]输出: [batch_size, num_heads, seq_len, head_dim]"""x = tf.reshape(x, (batch_size, -1, self.num_heads, self.head_dim))return tf.transpose(x, perm=[0, 2, 1, 3])def call(self, query, key, value, mask=None):batch_size = tf.shape(query)# 1. 线性变换Q = self.query_dense(query)  # [N, seq, D]K = self.key_dense(key)      # [N, seq, D]V = self.value_dense(value)  # [N, seq, D]# 2. 拆分多头Q = self.split_heads(Q, batch_size)  # [N, h, seq, d]K = self.split_heads(K, batch_size)  # [N, h, seq, d]V = self.split_heads(V, batch_size)  # [N, h, seq, d]# 3. 计算注意力分数matmul_qk = tf.matmul(Q, K, transpose_b=True)  # [N, h, seq_q, seq_k]scaled_attention_logits = matmul_qk / tf.math.sqrt(tf.cast(self.head_dim, tf.float32))# 4. 应用掩码(可选)if mask is not None:scaled_attention_logits += (mask * -1e9)  # 添加极大负值# 5. 计算注意力权重attention_weights = tf.nn.softmax(scaled_attention_logits, axis=-1)# 6. 应用权重到Valueoutput = tf.matmul(attention_weights, V)  # [N, h, seq_q, d]# 7. 合并多头output = tf.transpose(output, perm=[0, 2, 1, 3])  # [N, seq_q, h, d]concat_attention = tf.reshape(output, (batch_size, -1, self.embed_dim))# 8. 输出层return self.output_dense(concat_attention), attention_weights

三、维度变化全流程详解

1. 参数设定
  • batch_size = 2
  • seq_len = 5
  • embed_dim = 512
  • num_heads = 8
  • head_dim = 512 // 8 = 64
2. 维度变化流程图
原始输入: [2, 5, 512]│├─线性变换───────保持形状→ [2, 5, 512]│├─拆分多头──────→ [2, 8, 5, 64]│                (拆分512为8个64维头)│├─计算注意力分数──→ [2, 8, 5, 5]│                (每个头计算5x5的注意力矩阵)│├─Softmax───────→ [2, 8, 5, 5]│                (最后一维归一化)│├─应用权重到Value→ [2, 8, 5, 64]│                (每个头输出新的序列表示)│├─合并多头───────→ [2, 5, 512]│                (拼接8个64维头恢复512维)│└─输出层────────→ [2, 5, 512]
3. 关键步骤维度变化

在这里插入图片描述

四、关键实现细节解析

1. 多头拆分与合并
# 拆分多头(核心代码)
new_shape = x.size()[:-1] + (num_heads, head_dim)
x = x.view(*new_shape).permute(0, 2, 1, 3)# 合并多头(逆过程)
x = x.permute(0, 2, 1, 3).contiguous().view(batch_size, -1, embed_dim)
  • 为什么要permute:将num_heads维度提前,便于后续矩阵乘法并行处理多个头
2. 注意力分数计算
scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k)
  • 转置维度‌:将K的seq_len和head_dim维度交换,使矩阵乘法满足[seq_q, d] x [d, seq_k] → [seq_q, seq_k]
  • 缩放因子‌:防止点积结果过大导致softmax梯度消失
3. 掩码处理技巧

python

scores = scores.masked_fill(mask == 0, -1e9)
  • 作用‌:将填充位置(如)的注意力权重趋近于0
  • 为什么用-1e9‌:经过softmax后,exp(-1e9) ≈ 0

五、完整运行示例

# 测试用例
embed_dim = 512
num_heads = 8
model = MultiHeadAttention(embed_dim, num_heads)# 生成测试数据
batch_size = 2
seq_len = 5
inputs = torch.randn(batch_size, seq_len, embed_dim)# 前向传播
output, attn = model(inputs, inputs, inputs)# 验证输出形状
print(output.shape)  # torch.Size([2, 5, 512])
print(attn.shape)    # torch.Size([2, 8, 5, 5])

六、总结与常见问题

1. 核心优势
  • 并行计算效率‌:通过矩阵运算同时处理所有位置和注意力头
  • 多视角学习‌:不同注意力头可关注语法、语义等不同特征
  • 长距离依赖‌:直接计算任意两个位置间的关联
2. FAQ
  • Q1:为什么需要多个注意力头?‌

  • A:类比CNN中多个卷积核,不同头可以捕捉不同类型的特征依赖

  • Q2:head_dim为什么要设置为embed_dim/num_heads?‌

  • A:保持总参数量不变,确保拆分前后的维度乘积相等(num_heads * head_dim = embed_dim)

  • Q3:permute之后为什么要调用contiguous()?‌

  • A:确保张量在内存中连续存储,避免后续view操作报错

相关文章:

图解多头注意力机制:维度变化一镜到底

目录 一、多头注意力机制概述二、代码实现1. pyTorch 实现2. tensorFlow实现 三、维度变化全流程详解1. 参数设定2. 维度变化流程图3. 关键步骤维度变化 四、关键实现细节解析1. 多头拆分与合并2. 注意力分数计算3. 掩码处理技巧 五、完整运行示例六、总结与常见问题1. 核心优势…...

Navicat如何查看密码

近期遇到需要将大部分已存储的navicat数据库转发给其他人,于是乎进行导出文件 奈何对方不用navicat,无法进行文件的导入从而导入链接 搜罗navicat的密码查看,大部分都为php代码解析 以下转载GitHub上看到的一个python代码解析的脚本 这里是对…...

第4节:分类任务

引入: 独热编码(one-hot):对于分类任务的输出,也就是是或不是某类的问题,采取独热编码的形式将y由一离散值转化为连续的概率分布,最大值所在下标为预测类 输入的处理:对于任意一张…...

EasyCVR安防视频汇聚平台助力工业园区构建“感、存、知、用”一体化智能监管体系

在现代工业园区的安全管理和高效运营中,视频监控系统扮演着不可或缺的角色。然而,随着园区规模的扩大和业务的复杂化,传统的视频监控系统面临着诸多挑战,如设备众多难以统一管理、数据存储分散、智能分析能力不足、信息利用率低下…...

计算机网络——DNS

一、什么是DNS? DNS(Domain Name System,域名系统) 是互联网的核心服务,负责将人类可读的域名(如 www.baidu.com)转换为机器可识别的 IP地址(如 14.119.104.254)。它像一…...

STC89C52单片机学习——第20节: [8-2]串口向电脑发送数据电脑通过串口控制LED

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.03.15 51单片机学习——第20节: [8-2]串口向电脑发送数据&电脑通过串口控制LED 前言…...

1.5[hardware][day5]

Link类跳转指令可以拆分为两个部分,一个是跳转,即下一个PC的生成,如果将分支条件的比较放到译码级来进行,则这部分只涉及取值级和译码级流水;另一个是Link操作,简单来说就是写寄存器,这部则主要…...

Java 多线程编程:提升系统并发处理能力!

多线程是 Java 中实现并发任务执行的关键技术,能够显著提升程序在多核处理器上的性能以及处理多任务的能力。本文面向初级到中级开发者,从多线程的基本定义开始,逐步讲解线程创建、状态管理、同步机制、并发工具以及新兴的虚拟线程技术。每部…...

Mininet 的详细设计逻辑

Mininet 是一个轻量级网络仿真工具,其核心目标是在单台物理机上快速构建复杂的虚拟网络拓扑,支持 SDN(软件定义网络)和传统网络协议的实验与验证。其设计逻辑围绕 虚拟化、模块化 和 灵活性 展开,以下是其详细设计架构…...

原生微信小程序实现导航漫游(Tour)

效果&#xff1a; 小程序实现导航漫游 1、组件 miniprogram/components/tour/index.wxml <!--wxml--> <view class"guide" wx:if"{{showGuide}}"><view style"{{guideStyle}}" class"guide-box"><view class&quo…...

Spring(6)——Spring、Spring Boot 与 Spring MVC 的关系与区别

Spring、Spring Boot 与 Spring MVC 的关系与区别 1. 核心定位 Spring 定位&#xff1a;基础框架&#xff0c;提供 IoC&#xff08;控制反转&#xff09; 和 DI&#xff08;依赖注入&#xff09; 核心功能&#xff0c;管理对象生命周期及依赖关系。功能&#xff1a;支持事务管…...

神聖的綫性代數速成例題2. 行列式的性質

性質 1&#xff1a;行列式與它的轉置行列式相等&#xff1a; 設為行列式&#xff0c;為其轉置行列式&#xff0c;則。 性質 2&#xff1a;交換行列式的兩行 (列)&#xff0c;行列式變號&#xff1a; 若行列式經過交換第行和第行得到行列式&#xff0c;則。 性質 3&#xff…...

ModelScope推理QwQ32B

文章目录 ModelScope推理QwQ32Bmodel_scope下载QwQ32BModelScope 调用QwQ-32B ModelScope推理QwQ32B 以下载 qwq32b 为例子 需要安装的 python 包 transformers4.49.0 accelerate>0.26.0 torch2.4.1 triton3.0.0 safetensors0.4.5可以使用 conda 创建一个虚拟环境安装 cond…...

使用unsloth进行grpo强化学习训练

说明 unsloth框架可以进行各种sft训练&#xff0c;包括lora和grpo训练。我参考官方方法&#xff0c;使用模型Qwen2.5-3B-Instruct和数据集gsm8k&#xff0c;写了一个grpo训练的例子。 代码 这个代码加载模型Qwen2.5-3B-Instruct和数据集gsm8k。训练完成后先保存lora模型然后…...

【c++】【智能指针】shared_ptr底层实现

【c】【智能指针】shared_ptr底层实现 智能指针之前已经写过了&#xff0c;但是考虑到不够深入&#xff0c;应该再分篇写写。 1 shared_ptr 1.1 shared_ptr 是什么 std::shared_ptr是一个类模板&#xff0c;它的对象行为像指针&#xff0c;但是它还能记录有多少个对象共享它…...

python拉取大视频导入deepseek大模型解决方案

使用Python拉取大视频并导入大模型&#xff0c;需要综合考虑数据获取、存储、处理和资源管理&#xff0c;确保高效稳定地处理大视频数据&#xff0c;同时充分利用大模型的性能&#xff0c;以下是分步方案及代码示例&#xff1a; --- 1. 分块下载大视频&#xff08;避免内存溢出…...

【Python】面向对象

编程的两大特点 面向过程&#xff1a;着重于做什么面向对象&#xff08; oop&#xff09;&#xff1a;着重于谁去做 python是面向对象语言&#xff0c;面向对象三大特点&#xff1a;封装、继承、多态 面向对象&#xff1a;便于代码管理&#xff0c;方便迭代更新。 新式类、经…...

leetcode日记(100)填充每个节点的下一个右侧节点指针

和层序遍历差不多的思路&#xff0c;将节点储存在队列里&#xff0c;一边取出节点一边放入取出节点的左右节点&#xff0c;直到队列空。 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NU…...

docker入门篇

使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台&#xff0c;它可以让开发者将应用程序及其依赖打包到一个容器中&#xff0c;然后在任何环境中运行这个容器&#xff0…...

python语法

1. 前面先写import导入模块&#xff0c;完整的语法是&#xff1a; [from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名] 语法还可以是&#xff1a; from 模块名 import 功能名 如果import整个模块的话&#xff0c;需要用.功能名()&#xff0c;来用这个功能&#xff…...

Dify使用部署与应用实践

最近在研究AI Agent&#xff0c;发现大家都在用Dify&#xff0c;但Dify部署起来总是面临各种问题&#xff0c;而且我在部署和应用测试过程中也都遇到了&#xff0c;因此记录如下&#xff0c;供大家参考。Dify总体来说比较灵活&#xff0c;扩展性比较强&#xff0c;适合基于它做…...

微信小程序接入DeepSeek模型(火山方舟),并在视图中流式输出

引言&#xff1a; DeepSeek&#xff0c;作为一款先进的自然语言处理模型&#xff0c;以其强大的文本理解和生成能力著称。它能够处理复杂的文本信息&#xff0c;进行深度推理&#xff0c;并快速给出准确的回应。DeepSeek模型支持流式处理&#xff0c;这意味着它可以边计算边输…...

前端性能优化指标及优化方案

前端性能优化的核心目标是 提高页面加载速度、降低交互延迟、减少资源占用。常见的 Web 性能指标包括 LCP、FID、CLS、TTFB、TTI、FCP 等。 关键性能指标&#xff08;Web Vitals&#xff09; 指标优化方案 &#xff08;1&#xff09;LCP&#xff08;Largest Contentful Paint&…...

正则化介绍

简单介绍 正则化是用于控制模型的复杂度&#xff0c;防止模型在训练数据上过度拟合&#xff08;overfitting&#xff09;。正则化通过在模型的损失函数中引入额外的惩罚项&#xff0c;来对模型的参数进行约束&#xff0c;从而降低模型的复杂度。这个额外的惩罚通常与模型参数的…...

AI时代:数字媒体的无限可能

人工智能和数字媒体技术正深刻改变着我们的生活。通过大数据分析、机器学习等技术&#xff0c;人工智能不仅能精准预测用户需求&#xff0c;还能在医疗、金融等多个领域提供高效解决方案。与此同时&#xff0c;数字媒体技术的进步使得信息传播更加迅速和广泛。社会计算作为新兴…...

自动化爬虫drissionpage

自动化爬虫drissionpage官网 自动化测试框架&#xff1a;DrissionPage DrissionPage调用工具汇总 网络爬虫工具比较-DrissionPage、Selenium、Playwright...

禁毒知识竞赛主持稿串词

尊敬的各位领导、各位来宾、参赛选手们&#xff1a;大家好&#xff01; 在市禁毒委员会的领导下&#xff0c;今年我市开展了以“参与禁毒战争&#xff0c;构建和谐社会”为主题的禁毒宣传月活动。为了进一步加强我市禁毒宣传力度&#xff0c;促进社会治安的好转和社会主义物质文…...

【JDK17】Jlink一秒生成精简的JRE

之前介绍了 Java17模块化的JDK&#xff0c;模块化后按需使用Jlink 用于精简生成 JRE 环境&#xff0c;这让快速的开发环境增强了编码的愉悦感。在实际生产环境中使用 mave 进行项目的构建&#xff0c;其次再是精简 JRE 缩小容器镜像体积&#xff0c;为实现一体化的流程&#xf…...

机器学习周报--文献阅读

文章目录 摘要Abstract 1 文章内容1.1 模型结构1.1.1 LSTMAT的结构设置1.1.2 AWPSO算法优化模型 1.2 实验与结果讨论1.2.1 处理缺失数据1.2.2 模型评估指标1.2.3 比较实验1.2.4 消融实验&#xff08;ABLATION EXPERIMENTS&#xff09; 2相关知识2.1 自适应权重粒子群优化&#…...

硬件地址反序?用位操作为LED灯序“纠偏”。反转二进制数即可解决

特别有意思&#xff0c;LED的灯序与其硬件地址刚好相反&#xff0c;没办法直接通过加1实现二进制进位的亮灯操作&#xff0c;查了一些资料说用数组和switch实现&#xff0c;觉得太麻烦了&#xff0c;思索良久&#xff0c;就想到了反转二进制数解决这个问题。 reverse_bits( )是…...

A* floyd算法 bellman-ford

求源点到目标点最短距离 排序的里面要加上与目标点一个预估距离,与dj算法差距只有这儿 预估要小于等于真实的最短距离,吸引力要适当 越接近实际距离越快 #include<bits/stdc.h> using namespace std;// 方向向量&#xff1a;上、右、下、左 const vector<int> …...

【数据挖掘】KL散度(Kullback-Leibler Divergence, KLD)

KL散度&#xff08;Kullback-Leibler Divergence, KLD&#xff09; 是衡量两个概率分布 P 和 Q之间差异的一种非对称度量。它用于描述当使用分布 Q 逼近真实分布 P 时&#xff0c;信息丢失的程度。 KL散度的数学定义 给定两个离散概率分布 P(x)和 Q(x)&#xff0c;它们在相同的…...

Linux shell 进度条

概述 在 Linux Shell 中实现一个简单的进度条可以通过 printf 命令结合特殊字符来实现&#xff0c;以下是一个示例脚本&#xff0c;它模拟了一个从 0% 到 100% 的进度条。 作用 反馈任务进度&#xff1a;让用户直观了解任务执行的进展情况&#xff0c;比如文件拷贝、系统更新…...

ctfshow web刷题记录

RCE 第一题 eval代码执行 &#xff1a; 1、使用system 加通配符过滤 ?csystem("tac%20fl*") ; 2、反字节执行 xxx %20 echo 反字节 3、变量转移 重新定义一个变量 让他代替我们执行 4、伪协议玩法 ?cinclude$_GET[1]?>&1php://filter/readc…...

leetcode日记(101)填充每个节点的下一个右侧节点指针Ⅱ

意料之中有这题&#xff0c;将之前的思路换一下即可&#xff0c;层序遍历的思路将record&#xff08;记录下一个循环的次数&#xff09;手动加减。 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL)…...

大语言模型微调和大语言模型应用的区别?

1. 基本概念 微调&#xff08;Fine-tuning&#xff09; 定义&#xff1a;微调是指在预训练大语言模型的基础上&#xff0c;通过在特定领域或任务的数据上进一步训练&#xff0c;从而使模型在该特定任务上表现更优。 目的&#xff1a;适应具体的任务需求&#xff0c;比如法律文…...

Leetcode-131.Palindrome Partitioning [C++][Java]

目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-131.Palindrome Partitioninghttps://leetcode.com/problems/palindrome-partitioning/description/131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09;131. 分割回文串 - 给你一个字符串 s&#xff0c;请你…...

DeepSeek:开启机器人智能化的革命性突破

引言 在2025年全球机器人产业格局中&#xff0c;中国AI公司深度求索&#xff08;DeepSeek&#xff09;凭借开源机器人智能控制系统DeepSeek-R1&#xff0c;正在掀起一场从底层算法到应用生态的技术革命。不同于传统机器人依赖预设程序的局限&#xff0c;DeepSeek通过深度推理能…...

解决load()文件报错zipfile.BadZipFile: File is not a zip file

报错如下图&#xff1a; 有可能是资源没有关闭造成了错误&#xff0c;这个网上已经有很多解决方案了&#xff0c;大家可自行查阅。 如果你在别的地方都没有找到解决问题&#xff0c;那么可能是以下这种情况。 1、描述 我在服务器上的代码load()加载文件时&#xff0c;出现了…...

【Tools】Visual Studio Code安装保姆级教程(2025版)

00. 目录 文章目录 00. 目录01. Visual Studio Code概述02. Visual Studio Code下载03. Visual Studio Code安装04. Visual Studio Code配置05. 附录 01. Visual Studio Code概述 Visual Studio Code&#xff08;简称 VS Code&#xff09;是由微软开发的一款免费、开源且跨平台…...

Python库安装报错解决思路以及机器学习环境配置详细方案

文章目录 概要第三方库gdalmahotasgraphviznltk-datalazypredictscikit-surprisenb_extensions 机器学习GPU-torch安装torch_geometric安装ubuntu安装显卡驱动dlib安装torch-cluster、torch-scatter、torch-sparse和torch-geometricYOLOapextensorflow-gpu Python && P…...

ETIMEDOUT 网络超时问题

根据日志显示&#xff0c;你遇到的 ​**ETIMEDOUT 网络超时问题** 是由于 npm 无法连接到企业内部的 Nexus 仓库&#xff08;http://192.168.55.12:8001&#xff09;导致的。以下是具体原因和解决方案&#xff1a; 一、问题根源 ​Nexus 仓库不可达 日志中所有依赖包均尝试从 h…...

superset部署记录

具备网络条件的&#xff0c;完全可以一键部署&#xff0c;不需要折腾。网络条件不具备时&#xff0c;部署记录留存备查。 1、正常模式 详细介绍参考&#xff1a;【开源项目推荐】Apache Superset——最优秀的开源数据可视化与数据探索平台-腾讯云开发者社区-腾讯云 (tencent.c…...

todolist docker 小工具

参考链接 前排提示 没有中文&#xff0c;可使用浏览器 翻译 前提 安装docker安装docker-compose 下载仓库 git clone https://github.com/JordanKnott/taskcafe进行安装 cd taskcafe docker-compose -p taskcafe up -d服务启动后会监听在 3333 端口上&#xff0c;通过浏览器…...

PowerToys:解锁Windows生产力的终极武器

欢迎来到涛涛聊AI。今天想着把win键和加号的组合键映射为win键和Q键盘。经过搜索发现PowerToys。 在数字化办公的浪潮中&#xff0c;效率是职场人永恒的追求。微软推出的 PowerToys 作为Windows官方系统强化工具&#xff0c;凭借其强大的功能和开源免费的特性&#xff0c;已成为…...

内存管理:

我们今天来学习一下内存管理&#xff1a; 1. 内存分布&#xff1a; 我们先来看一下我们下面的图片&#xff1a; 这个就是我们的内存&#xff0c;我们的内存分为栈区&#xff0c;堆区&#xff0c;静态区&#xff0c;常量区&#xff1b; 我们的函数栈帧开辟消耗的内存就是我们…...

ElementUI 表格中插入图片缩略图,鼠标悬停显示大图

如何在 ElementUI 的表格组件 Table 中插入图片缩略图&#xff0c;通过鼠标悬停显示大图&#xff1f;介绍以下2种方式&#xff1a; 方法1&#xff1a;直接在模板元素中插入 <template><el-table :data"tableData"><el-table-column label"图片…...

从被动响应到主动预见:智能可观测性技术的变革与实践

思维导图 一、引言 &#x1f303; 想象一下&#xff0c;在一个深夜 &#x1f319;&#xff0c;你的关键业务系统突然出现故障 &#x1f6a8;。传统情况下&#xff0c;你可能会收到大量不相关的告警 &#x1f4f1;&#x1f4ac;&#x1f4ac;&#x1f4ac;&#xff0c;然后花费…...

【Linux】五种 IO 模型与非阻塞 IO

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 重新理解 IO&#x1f98b; 为什么说网络问题的本质是 I/O 问题&#xff1f;&#x1f380; 从数据流动看网络通信&#x1f380; 网络 I/O 的瓶颈 &#x1f…...

从零开始开发纯血鸿蒙应用之无框截图

从零开始开发纯血鸿蒙应用 〇、前言二、元素定位1、理论依据2、使用指导 三、认识 ComponentSnapshot1、get 方法2、获取 ComponentSnapshot 实例 四、实现组件截图1、掌握图片编码能力2、保存到图库3、实现组件截图 〇、前言 截图&#xff0c;或者说截屏&#xff0c;已经是每…...