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

transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3

目录

前言

掩码张量

什么是掩码张量

掩码张量的作用

生成掩码张量实现

注意力机制

学习目标

注意力计算规则

注意力和自注意力

注意力机制

注意力机制计算规则的代码实现

多头注意力机制

学习目标

什么是多头注意力机制 

多头注意力计算机制的作用

多头注意力机制的代码实现


前言

        在之前的小节中我们学习了词嵌入层(词向量编码)以及加入了位置编码的输入层的概念和代码实现的学习。在本小节中我们将学习transformer中最重要的部分-注意力机制

掩码张量

        我们先学习掩码张量。现提出两个问题:什么是掩码张量?生成掩码张量的过程?

什么是掩码张量

        张量尺寸不定,里面只有(0,1)元素,代表位置被遮掩或者不遮掩,它的作用就是让另外一张张量中的一些数值被遮掩,被替换,表现形式是一个张量。

掩码张量的作用

        在transformer中掩码张量的主要作用在应用attention时,有一些生成的attention张量中的值计算有可能已知了未来信息而得到的,未来信息被看到是因为训练时会把整个输出结果都一次性的Embedding,但是理论上的解码器的输出却并不是一次就能产生的最终结果的,而是一次次通过上一次结果综合得出的,因此,未来信息可能被提前利用,所以进行遮掩。

生成掩码张量实现

#生成掩码张量的代码分析
def  subsequeent_mask(size):#生成向后遮掩的掩码张量,参数size是掩码张量最后两个维度的大小,形成一个方阵#在函数中,首先定义掩码张量的形状attn_shape = (1,size,size)#使用np.ones方法像这个方阵中添加1元素,形成上三角阵#节约空间将数据类型变为无符号8位整型数字unit8subsequeent_mask = np.triu(np.ones(attn_shape),k=1 ).astype('uint8')#转换成tensor,内部做一个 1 - 操作实现反转return torch.from_numpy(1 - subsequeent_mask)
size = 5
sm = subsequeent_mask(size)
print('sm:',sm)

#掩码张量的可视化
plt.figure(figsize=(5,5))
plt.imshow(subsequeent_mask(20)[0])

        黄色是1的部分,这里代表被遮掩,紫色代表没有被遮掩,横坐标代表目标词汇的位置,纵坐标代表可查的位置。从上往下看,在0的位置看过去都是黄色,都被遮住了,1的位置望过去还是黄色,说明第一次词还没有产生,从第二位置看过去,就能看到位置1的词,其他位置看不到,以此类推

注意力机制

学习目标

        掌握注意力计算规则和注意力机制

        掌握注意力计算规则的实现过程(最具有辨识度的部分)

注意力计算规则

        它需要3个指定的输入Q(query),K(key),V(value),通过公式计算得出注意力的计算结果

        query在key和Value的作用下表示:

        Attention(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt{d_{k}}})V

        大家想要了解具体注意力计算规则可以去了解自然语言处理-BERT处理框架-transformer这篇文章,里面有具体的Q,K,V注意力计算规则介绍。

注意力和自注意力

        这两者的区别在于Q,K,V矩阵。注意力,刚开始时Q矩阵输入原词向量,而K,V矩阵输入人为添加的已经总结好的特征向量且默认K=V。自注意力,开始时输入Q=K=V,K,V没有人为干扰完全自己去迭代。

注意力机制

        之前我们都是纸上谈兵,要使注意力计算规则能够应用在深度学习的网络,成为载体,包括全连接层以及相关张量的处理。

        注意力机制在网络中实现的图形表示:

注意力机制计算规则的代码实现

#注意力计算规则的代码分析
def attention(query,key,value,mask=None,dropout=None):#注意力机制实现:输入分别是query,key,value,mask:掩码张量#在函数中,首先取query的最后一维的大小,词嵌入的维度d_kd_k,来进行缩放d_k = query.size(-1)#按照公式,将query与key的转置相乘,这里面key是将最后两个维度进行转置,再除以缩放系数#得到得分张量scoresscores = torch.matmul(query,key.transpose(-2,-1)) / math.sqrt(d_k)#判断是否使用掩码张量if mask is not None:#使用tensor的masked_fill方法,将掩码张量和scores张量的每一个位置一一比较,如果等于0就一一替换#则对应的socers张量用-1e9这个值来代替scores = scores.masked_fill(mask == 0,-1e9)#对scores的最后一维进行softmax操作,使用F.softmax方法,第一个参数是softmax对象,#获得最终的注意力张量p_attn = F.softmax(scores,dim=-1)#判断是否使用dropout进行随机置0if dropout is not None:#将p_attn传入dropout对象进行‘丢弃’处理p_attn = dropout(p_attn)#最后,根据公式将p_attn与value张量相乘获得最终的query注意力表示,同时返回注意力张量return torch.matmul(p_attn,value), p_attn
query = key = value = pe_result #自注意力机制
print(query.shape)
mask = Variable(torch.zeros(2,4,4))
attn,p_attn = attention(query,key,value,mask=mask)
print('attn:',attn)
print(attn.shape)
print('p_attn:',p_attn)
print(p_attn.shape)

多头注意力机制

学习目标

        了解多头注意力机制的作用,掌握多头注意力机制的实现过程

        多头注意力机制结构图:

什么是多头注意力机制 

        在图中,我们可以看到,有一组Linear层进行线性变换,变换前后的维度不变,就当是一个方阵的张量,每个张量的值不同,那么变化后的结果也不同,特征就丰富起来了。变换后进入注意力计算机制,一组有多少个linear层并行,就代表有几个头,将计算结果最后一维(Q*K^T)分割,然后组合成scores。

多头注意力计算机制的作用

        这种结构的设计能够让每个注意力机制去优化每个词的不同特征部分,从而均衡同一种注意力机制可能产生的偏差,让词义拥有更多元的表达,实验表明可以提升模型的效果。

多头注意力机制的代码实现

#多头注意力机制的实现#定义一个克隆函数,因为在多头注意力机制的实现中,用到多个结构相同的线性层
#我们将使用clone函数将他们一同初始化在一个网络层列表对象中,之后的结构中也会使用到该函数
def clones(module,N):#用于生成相同的网络层的克隆函数,它的参数module表示要克隆的目标网络层,N代表需要克隆的数量#在函数中,我们通过for循环对module进行N次的深度拷贝,使其每个module成为独立的层#然后将其放在nn.ModuleList类型的列表中存放return nn.ModuleList([copy.deepcopy(module) for _ in range(N)])
#使用一个类来实现多头注意力机制的处理
class MutiHeadedAttention(nn.Module):def __init__(self, head,embedding_dim,dropout=0.1):#在类的初始化时,会传入3个参数,head代表头数,embedding_dim代表词嵌入的维度#dropout代表进行dropout操作时置0比率super(MutiHeadedAttention,self).__init__()#在函数中,首先使用了一个测试中常用的assert语句,判断h是否能被d_model整除#这是因为我们之后要每个头分配等量的词特征,也就是emdedding_dim/head个assert embedding_dim % head == 0#得到每个头获得的分割词向量的维度d_kself.d_k = embedding_dim // head#传入头数self.head = headself.embedding_dim = embedding_dim#然后获得线性层的对象,通过nn.linear实例化,它的内部变换矩阵是embedding_dim x embedding_dim#为什么是4个呢,这是因为在多头注意力中Q,K,V各需要一个,拼接矩阵也需要一个self.linears = clones(nn.Linear(embedding_dim,embedding_dim),4)#self.attn为None,它代表最后获得的注意力张量self.attn = None#最后一个是self.dropout对象,它通过nn中的Dropout实例化而来,置0比率为传进来的的参数dropoutself.dropout = nn.Dropout(p=dropout)def forward(self,query,key,value,mask=None):#前向逻辑函数,它的输入参数有四个,前三个就是注意力机制需要的Q,K,V#最后一个是注意力机制中可能需要的mask掩码,默认是None#如果存在掩码张量maskif mask is not None:#使用unsqueeze拓展维度,代表多头中的第n个头mask = mask.unsqueeze(1)#接着,我们获得一个batch_size的变量,他是query尺寸的第一个数字,代表有多少条样本batch_size = query.size(0)#之后就进入多头处理环节#首先利用zip将QKV与三个线性层住到一起,然后使用for循环,将输入的QKV分别传到线性层中#做完线性变换后,开始为每个头分割输入,这里使用view方法对线性变换的结果进行维度重塑#这样就意味着每个头可以获得一部分词特征组成的句子,其中的-1代表自适应维度#计算机会根据这种变换自动计算这里的值,然后对第二维度和第三维度进行转置操作#为了句子长度维度和词向量维度能够相邻,这样注意力机制才能找到词义与句子位置的关系#从attention函数中可以看到,利用的是原始输入的倒数第一和第二维,这样我们就能得到每个头的query,key,value = \[model(x).view(batch_size,-1,self.head,self.d_k).transpose(1,2) for model,x in zip(self.linears,(query,key,value))]#print(query.shape)#print(key.shape)#print(value.shape)#得到每个头的输入后,接下来就是将他们传入到attention中#这里直接调用我们之前实现的attention函数。同时也将mask和dropout传入其中x,self.attn = attention(query,key,value,mask=mask,dropout=self.dropout)#通过多头注意力计算后,我们就得到每个头计算结果组成的4维张量,我们需要将其转换成为输入的格式#因此这里卡开始进行第一步处理:逆操作,先对第二第三维进行转置,然后使用contiguous方法#这个方法的作用就是让能够让转置后的张量应用view方法,否则将无法直接使用#所以,下一步就是使用view重塑,变成和输入形状相同x = x.transpose(1,2).contiguous().view(batch_size,-1,self.head * self.d_k)#最后使用线性层列表中的最后一个线性层对输入进行线性变换得到最终的多头注意力结构的输出return self.linears[-1](x)
#实例化参数
head = 8
embedding_dim = 512
dropout = 0.2#若干输入参数的初始化
query = key = value = pe_resultmask = Variable(torch.zeros(2,4,4))mha = MutiHeadedAttention(head,embedding_dim,dropout)mha_result = mha(query,key,value,mask)print(mha_result)
print(mha_result.shape)

相关文章:

transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3

目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…...

SpringBoot生成唯一ID的方式

1.为什么要生成唯一ID? 数据唯一性:每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行,并有助于准确地查询、更新或删除特定的记录。 数据完整性:通过使用唯一ID,可以保证数据库中的数…...

认识时钟树

时钟源 高速外部震荡器HSE 低速外部震荡器LSE 高速内部震荡器HSI 低速内部震荡器LSI 易混淆点: RC(Resistor-Capacitor,电阻-电容振荡器)一般是内部时钟源 RTC(Real-Time Clock,实时时钟)…...

NLP如何训练AI模型以理解知识

一、自然语言处理(NLP)的定义与核心目标 1. 什么是自然语言处理? NLP是计算机科学与人工智能的交叉领域,旨在让机器具备以下能力: • 理解:解析人类语言(文本或语音)的语法、语义和…...

linux如何在某个文件夹下查看所有文件(层级只到当前文件夹的两层)并找到‘XXXX’ 这个单词

问了AI写的不错,记录一下,排查一些报错的时候比较好用 在 Linux 中,您可以通过命令行工具查看某个文件夹下的所有文件(限制到当前文件夹及其子文件夹两层深度),并搜索包含特定单词(如 XXXXX&am…...

Android 常见View的防抖

在开发Android应用时,我们经常会遇到用户快速点击按钮或者频繁触发某个事件的情况。这种行为可能会导致不必要的重复操作,例如多次提交表单、重复加载数据等。为了避免这些问题,我们需要对这些事件进行防抖处理。本文将详细介绍如何在Kotlin中…...

Unity打包到webgl鼠标图标大小不正确

我使用了自定义鼠标纹理,打包出来发现鼠标特别的大,位置也不对劲 研究了一下,不考虑浏览器界面缩放的话,可以直接改import settings的最大尺寸,改成合适的尺寸。 暂时先这样解决吧 最后贴一个设置鼠标图标的代码 pub…...

CentOS 7中安装Dify

Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时,会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…...

爬蟲動態IP代理與數據採集穩定性

對於從事爬蟲開發的人來說,IP代理的使用直接影響了爬蟲的效率和穩定性。爬蟲的本質是模擬用戶訪問網站,通過抓取網頁內容來獲取所需數據。但大多數網站為了保護自己的數據或防止濫用,會設置諸如IP訪問頻率限制、登錄驗證甚至封禁等反爬蟲措施…...

excel 斜向拆分单元格

右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后,你可以开始输入文字。 需要注意的是,文字并不会自动分成上下两行。 为了达到你期望的效果,你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…...

React Native 实现滑一点点内容区块指示器也滑一点点

效果图如上,内容滑一点点,指示器也按比例话一点点,列表宽度跟数据有关。 实现思路如下: 1.监听列表滑动事件,获取列表横向滑动距离,假设为A; 2.获取列表的宽度,及列表可滑动的宽度…...

解决Vscode项目同时运行两个项目终端无法自动叠加的问题

终端(如命令行工具或服务进程)无法自动“叠加”使用同一资源(如端口号、进程ID等)的核心原因在于操作系统的资源管理机制和网络协议规范的限制。以下是具体分析: 以下是解决 VSCode 同时运行两个项目时终端被前一个占…...

vuex中的state是响应式的吗?

在 Vue.js 中,Vuex 的 state 是响应式的。这意味着当你更改 state 中的数据时,依赖于这些数据的 Vue 组件会自动更新。这是通过 Vue 的响应式系统实现的,该系统使用了 ES6 的 Proxy 对象来监听数据的变化。 当你在 Vuex 中定义了一个 state …...

k8s面试题总结(九)

1.K8s中pod删除失败,有哪些情况?如何解决? Pod删除失败的情况: (1) Pod被其他资源(如Deployment,ReplicaSet)引用,无法删除pod 解决:先删除引用该pod的资源,再删除pod…...

【JQuery—前端快速入门】JQuery 操作元素

JQuery 操作元素 1. 获取/修改元素内容 三个简单的获取元素的方法: 这三个方法即可以获取元素的内容,又可以设置元素的内容. 有参数时,就进行元素的值设置,没有参数时,就进行元素内容的获取. 接下来,我们需…...

三维数据可视化与表面重建:Marching Cubes算法的原理与应用

1. 引言 随着现代医学影像技术的飞速发展,三维数据的可视化与重建已成为医学研究、临床诊断和手术规划的重要工具。在众多三维重建算法中,Marching Cubes算法因其高效、稳定的特性成为从离散数据场中提取等值面的经典方法。本报告将深入探讨Marching Cu…...

网络变压器的主要电性参数与测试方法(2)

Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(2).. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法: 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…...

端到端自动驾驶——cnn网络搭建

论文参考:https://arxiv.org/abs/1604.07316 demo 今天主要来看一个如何通过图像直接到控制的自动驾驶端到端的项目,首先需要配置好我的仿真环境,下载软件udacity: https://d17h27t6h515a5.cloudfront.net/topher/2016/November…...

# 【Unity】【游戏开发】赛车游戏中碰撞加速的实现方法

背景 在赛车类游戏开发中,常常需要实现赛车在碰撞某些道具或对象后加速的功能。例如,当赛车经过加速带或碰撞加速道具时,速度会瞬间增加,使游戏更具动态性和可玩性。本文将介绍一种通用的实现方式,并分析其逻辑。 分析 加速的核心逻辑如下: 判断碰撞条件:检测赛车是否…...

Dubbo本地服务调试

本地服务之间调试 参考这个文档: Dubbo本地调试 注意事项 本地主服务调用本地另外一个子服务,dubbo端口号与子服务的WEB端口号不一致。要查看子服务dubbo的配置文件,设置的rpc端口号是多少主服务中,最好在dubbo的配置文件&…...

SqlSugar 语法糖推荐方式

//方式1&#xff1a;var dd _repository._Db.Queryable<ConfigAggregateRoot, UserRoleEntity>((o, p) > o.Id p.Id).Select((o, p) > new{o.Id,o.Remark,p.RoleId,});//方式2&#xff1a;不推荐使用&#xff0c;建议优先使用 Lambda 表达式&#xff0c;因为它更…...

爬虫逆向实战小记——解决captcha滑动验证码

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; IGh0dHBzOi8vY2FwdGNoYS5ydWlqaWUuY29tLmNuLw 第一步: 分析请求网址和响应内容 (1)通过观察&#xff0c;滑…...

printf 与前置++、后置++、前置--、后置-- 的关系

# 前置和前置-- 先看一段代码 大家是不是认为printf输出的是 2 3 3 2 1 1 但是实际输出的是 3 3 3 1 1 1 在这两行printf函数代码里&#xff0c;编译器会先计算 a 和 --a 的值&#xff0c;然后再 从右向左 开始输出。 printf函数中&#xff0c;如果有多个…...

【Web前端开发】---HTML标签及标签属性

1、单标签与双标签 HTML标签分为&#xff1a;双标签、单标签。 例如&#xff1a; <marquee>你好</marquee> 示例&#xff1a; 双标签&#xff1a;<标签名>标签体</标签名> 单标签&#xff1a;<标签名/>&#xff08;注意&#xff1a;/可以省…...

【大模型系列篇】国产开源大模型DeepSeek-V3技术报告解析

DeepSeek-V3技术报告 目录 DeepSeek-V3技术报告 1. 摘要 2. 引言 3. DeepSeek V3 架构 3.1 基础架构 3.1.1. 多头潜在注意力 3.1.2. DeepSeekMoE和无辅助损失的负载均衡 3.2 多令牌预测 4. 基础设施 4.1 计算集群 4.2 训练框架 4.2.1. DualPipe算法与计算通信协同优…...

【赵渝强老师】监控Redis

对运行状态的Redis实例进行监控是运维管理中非常重要的内容&#xff0c;包括&#xff1a;监控Redis的内存、监控Redis的吞吐量、监控Redis的运行时信息和监控Redis的延时。通过Redis提供的监控命令便能非常方便地实现对各项指标的监控。 一、监控Redis的内存 视频讲解如下 【…...

RocketMQ顺序消费机制

RocketMQ的顺序消费机制通过生产端和消费端的协同设计实现&#xff0c;其核心在于局部顺序性&#xff0c;即保证同一队列&#xff08;MessageQueue&#xff09;内的消息严格按发送顺序消费。以下是详细机制解析及关键源码实现&#xff1a; 一、顺序消费的核心机制 1. 生产端路…...

新装的conda 以及pycharm未能正确初始化,或conda环境变量配置错误问题解决!!!

Windows PowerShell 版权所有&#xff08;C&#xff09; Microsoft Corporation。保留所有权利。 安装最新的 PowerShell&#xff0c;了解新功能和改进&#xff01;https://aka.ms/PSWindows PS E:\Dev_project\MyProjects> conda cativate py12 usage: conda-script.py [-h…...

通往 AI 之路:Python 机器学习入门-线性代数

2.1 线性代数&#xff08;机器学习的核心&#xff09; 线性代数是机器学习的基础之一&#xff0c;许多核心算法都依赖矩阵运算。本章将介绍线性代数中的基本概念&#xff0c;包括标量、向量、矩阵、矩阵运算、特征值与特征向量&#xff0c;以及奇异值分解&#xff08;SVD&…...

2025国家护网HVV高频面试题总结来了03(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 0x1 高频面试题第一套 0x2 高频面试题第二套 0x3 高频面试题第三套 0x4高频面试题第四套 0x1 高频面试题…...

内容中台与企业内容管理架构解析

内容中台技术架构解析 内容中台的技术架构以数据资产化和服务API化为核心&#xff0c;通过解耦内容生产与消费环节构建数字化基础设施。其架构通常包含统一内容池、智能处理引擎和开放接口层三大模块&#xff1a;统一内容池通过标准化元数据模型对多源异构内容进行结构化存储&…...

希音(Shein)前端开发面试题集锦和参考答案

用 Node 写过什么工具或 npm 包 在实际开发中,使用 Node 编写过多种实用工具和 npm 包。 自动化构建工具 开发了一个简单的自动化构建工具,用于处理前端项目的资源压缩和合并。在前端项目中,为了优化性能,需要对 CSS 和 JavaScript 文件进行压缩,减少文件体积,同时将多个…...

《一个端粒到端粒的参考基因组为木瓜中五环三萜类化合物生物合成提供了遗传学见解》

A telomere-to-telomere reference genome provides genetic insight into the pentacyclic triterpenoid biosynthesis in Chaenomeles speciosa Amplification of transposable elements 转座元件的扩增 Sequence mining disclosed that TEs were one main event in the ex…...

使用easyocr、PyPDF2对图像及PDF文档进行识别

一、概述 本 Python 脚本的主要功能是对当前目录及其子目录下的图片和 PDF 文件进行光学字符识别&#xff08;OCR&#xff09;处理。它使用 easyocr 库处理图片中的文字&#xff0c;使用 PyPDF2 库提取 PDF 文件中的文本&#xff0c;并将处理结果保存为文本文件。同时&#xff…...

用AI学安卓游戏开发1——控制小球上下左右移动2

业务逻辑&#xff1a;初始化小球随机自有移动&#xff0c;遇到屏幕边缘反弹&#xff0c;摇杆介入后小球停止自有移动&#xff0c;按照摇杆控制方向移动。 https://download.csdn.net/download/AnalogElectronic/90453667 https://download.csdn.net/download/AnalogElectronic…...

计算机毕业设计SpringBoot+Vue.js医院挂号就诊系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

说一下redis事务底层原理

Redis事务 1. 事务的基本流程 Redis 事务通过 MULTI、EXEC、WATCH 等命令实现&#xff0c;底层原理可以分为以下几个步骤&#xff1a; (1) MULTI 命令 当客户端发送 MULTI 命令时&#xff0c;Redis 会将客户端标记为“事务模式”。在事务模式下&#xff0c;客户端发送的所有…...

eNSP中AR2220、AR201、AR1220、AR2240、AR3260、Router、NE40E、NE5000E、NE9000、CX路由器学习笔记

eNSP中常见华为路由器型号的接口特性详解及横向对比&#xff0c;重点关注接口类型、扩展能力和适用场景&#xff1a; 缩写解释&#xff1a; LPU&#xff1a;Line Processing Unit&#xff08;线路处理单元&#xff09; SPU&#xff1a;Service Processing Unit&#xff08;业务…...

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

文章目录 FastGPT 引申&#xff1a;借鉴 FastGPT 基于MySQL ES 实现知识库&#xff08;含表结构以及核心代码&#xff09;一、整体思路二、存储结构2.1 MySQL 表结构(1) knowledge_base_dataset(2) knowledge_base_data(3) knowledge_base_index(4) ai_kb_relation 2.2 Elasti…...

WPF+WebView 基础

1、基于.NET8&#xff0c;通过NuGet添加Microsoft.Web.WebView2。 2、MainWindow.xaml代码如下。 <Window x:Class"Demo.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/win…...

skia的学习与研究

最近再研究skia,特地发一篇文章来记录一下。Skia版本更新非常频繁&#xff0c;大概每四周就会创建一个新版本&#xff0c;此版本持续维护六周左右就会被标记为稳定分支&#xff1b; skia三套渲染&#xff1a; 无gpu硬件如嵌入式设备&#xff0c;使用CPU渲染&#xff0c;使用…...

Linux--基础命令3

大家好&#xff0c;今天我们继续学习Linux的基础命令 mv命令 mv命令是move的缩写&#xff0c;可以用来移动文件或者将文件改名 move(rename) files&#xff0c;经常⽤来备份⽂件或者目录 语法: mv [ 选项 ] 源⽂件或目录 目标⽂件或目录 mv src[文件、目录] dst[路径、文…...

[LeetCode]day33 150.逆波兰式求表达值 + 239.滑动窗口最大值

逆波兰式求表达值 题目链接 题目描述 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 ‘’、‘-’、‘*’ 和 ‘/’ 。 每个操作数&#xff08;运…...

记一次误禁用USB导致键盘鼠标失灵的修复过程

背景说明 在电脑上插入了一个USB hub&#xff0c;然后弹窗提示&#xff1a;“集线器端口上出现电涌”&#xff0c;点开让选择“重置”或者“关闭”&#xff0c;不小心点了关闭&#xff0c;结果这个usb口就被关了&#xff0c;再插任何东西都没反应&#xff0c;找了很多办法都恢…...

node项目前后端密码加密传输及存储方案

前端&#xff1a;使用crypto-js库的SHA256算法&#xff0c;包含用户注册时使用的邮箱加上自定义的secret key生成盐值&#xff0c;接着使用PBKDF2算法进行加密。最后将加密后的密码传给后端。 import CryptoJS from "crypto-js";export const encryptPassword (ema…...

GIt分支合并

分支 1: C0 → C1 → C2 → C3&#xff08;最新&#xff09; 分支 2: C0 → C4 → C5 → C6&#xff08;最新&#xff09;1. 找到共同父节点 C0 Git 会先找出 branch1 和 branch2 的共同祖先节点 C0。这通常借助 git merge-base 命令达成&#xff0c;虽然在日常使用 git merge…...

Python 入门教程(2)搭建环境 | 2.3、VSCode配置Python开发环境

文章目录 一、VSCode配置Python开发环境1、软件安装2、安装Python插件3、配置Python环境4、包管理5、调试程序 前言 Visual Studio Code&#xff08;简称VSCode&#xff09;以其强大的功能和灵活的扩展性&#xff0c;成为了许多开发者的首选。本文将详细介绍如何在VSCode中配置…...

linux一些使用技巧

linux一些使用技巧 文件名称和路径的提取切换用户执行当前脚本一行演示单引号与双引号的使用curl命令仅输出响应头信息,不输出body体文件名称和路径的提取 文件路径为 /tmp/tkgup/test.sh 方式获取文件名获取文件路径获取文件全路径方式一basename ${file}dirname ${file}real…...

GPU/CUDA 发展编年史:从 3D 渲染到 AI 大模型时代(上)

目录 文章目录 目录1960s~1999&#xff1a;GPU 的诞生&#xff1a;光栅化&#xff08;Rasterization&#xff09;3D 渲染算法的硬件化实现之路学术界算法研究历程工业界产品研发历程光栅化技术原理光栅化技术的软件实现&#xff1a;OpenGL 3D 渲染管线设计1. 顶点处理&#xff…...

chrome Vue.js devtools 提示不支持该扩展组件,移除

可能是版本不兼容&#xff0c;可以重新安装&#xff0c;推荐网址极简插件官网_Chrome插件下载_Chrome浏览器应用商店 直接搜索vue&#xff0c;下载旧版&#xff0c;vue2、vue3都支持&#xff0c;上面那个最新版本试了下&#xff0c;vue2的肯定是不能用...