从代码学习深度学习 - Bahdanau注意力 PyTorch版
文章目录
- 1. 前言
- 为什么选择Bahdanau注意力
- 本文目标与预备知识
- 2. Bahdanau注意力机制概述
- 注意力机制简述
- 加性注意力与乘性注意力对比
- Bahdanau注意力的数学原理与流程图
- 数学原理
- 流程图
- 可视化与直观理解
- 3. 数据准备与预处理
- 数据集简介
- 数据加载与预处理
- 1. 读取数据集
- 2. 预处理文本
- 3. 词元化
- 词表构建
- 序列截断与填充
- 构建张量与有效长度
- 创建数据迭代器
- 数据准备的关键点
- 与Bahdanau注意力的关联
- 总结
- 4. 模型组件搭建
- 4.1 总体架构概述
- 4.2 编码器(Encoder)
- 4.3 解码器(Decoder)
- 4.4 Bahdanau注意力机制(AdditiveAttention)
- 4.5 屏蔽机制(sequence_mask 和 masked_softmax)
- sequence_mask
- masked_softmax
- 4.6 数据加载与模型整合
- 4.7 关键点与优势
- 4.8 可视化与验证
- 4.9 总结
- 5. 训练流程实现
- 5.1 数据加载
- 5.2 模型定义
- 5.3 训练过程
- 5.3.1 权重初始化
- 5.3.2 优化器和损失函数
- 5.3.3 训练循环
- 5.3.4 训练结果输出
- 5.4 预测与评估
- 5.4.1 预测实现
- 5.4.2 BLEU 分数评估
- 5.4.3 注意力权重可视化
- 5.5 实现亮点
- 5.6 总结
- 6. 模型推理与预测
- 6.1 序列翻译预测函数详解
- 6.1.1 函数定义与参数
- 6.1.2 预处理阶段
- 6.1.3 编码器前向传播
- 6.1.4 解码器逐时间步预测
- 6.1.5 输出处理
- 6.1.6 实现亮点
- 6.1.7 潜在改进方向
- 6.2 BLEU 评估指标解释与实现
- 6.2.1 BLEU 指标概述
- 6.2.2 函数定义与参数
- 6.2.3 计算逻辑与实现
- 6.2.3.1 预处理
- 6.2.3.2 长度惩罚
- 6.2.3.3 n-gram 精确度
- 6.2.3.4 返回结果
- 6.2.4 BLEU 的意义与局限性
- 6.2.5 实现亮点
- 6.2.6 潜在改进方向
- 6.3 总结
- 7. 可视化注意力权重
- 7.1 注意力热图绘制与分析
- 7.1.1 代码实现
- 7.1.2 热图分析
- 7.1.3 可视化效果
- 7.2 模型关注词元的可解释性展示
- 7.2.1 可解释性意义
- 7.2.2 可视化案例
- 7.2.3 提升可解释性的方法
- 7.3 实现亮点
- 8. 总结
- 8.1 Bahdanau 注意力的实现经验分享
- 8.2 PyTorch 中模块化建模的优势
- 8.3 下一步可以探索的方向
- 8.4 总结
完整代码:下载连接
1. 前言
为什么选择Bahdanau注意力
在深度学习领域,尤其是自然语言处理(NLP)任务中,序列到序列(Seq2Seq)模型是许多应用的核心,如机器翻译、文本摘要和对话系统等。传统的Seq2Seq模型依赖于编码器-解码器架构,通过编码器将输入序列压缩为固定长度的上下文向量,再由解码器生成输出序列。然而,这种方法在处理长序列时往往面临信息丢失的问题,上下文向量难以捕捉输入序列的全部细节。
Bahdanau注意力机制(Bahdanau et al., 2014)通过引入动态的上下文选择机制,显著提升了模型对输入序列的利用效率。它允许解码器在生成每个输出时,动态地关注输入序列的不同部分,而非依赖单一的上下文向量。这种机制不仅提高了翻译质量,还为后续的注意力机制(如Transformer)奠定了基础。选择Bahdanau注意力作为学习对象,是因为它直观地展示了注意力机制的核心思想,同时在实现上具有足够的复杂度,能够帮助我们深入理解深度学习的建模过程。
此外,PyTorch作为一个灵活且直观的深度学习框架,非常适合实现和调试复杂的模型结构。通过本文的代码分析,我们将以Bahdanau注意力为核心,结合PyTorch的模块化编程,探索Seq2Seq模型的完整实现流程,为进一步学习Transformer等高级模型打下坚实基础。
本文目标与预备知识
本文的目标是通过剖析一个基于PyTorch实现的Bahdanau注意力Seq2Seq模型,帮助读者从代码层面理解深度学习模型的设计与实现。我们将从数据预处理、模型组件搭建、训练流程到推理与可视化,逐步拆解每个环节的核心代码,揭示Bahdanau注意力机制的运作原理,并提供直观的解释和可视化结果。同时,通过模块化代码的分析,我们将展示如何在PyTorch中高效地组织复杂项目。
为了更好地理解本文内容,建议读者具备以下预备知识:
- Python编程基础:熟悉Python语法、面向对象编程以及PyTorch的基本操作(如张量操作、模块定义和自动求导)。
- 深度学习基础:了解神经网络的基本概念(如前向传播、反向传播、损失函数和优化器),以及循环神经网络(RNN)或门控循环单元(GRU)的工作原理。
- NLP基础:对词嵌入(Word Embedding)、序列建模和机器翻译任务有初步了解。
- 数学基础:熟悉线性代数(如矩阵运算)、概率论(softmax函数)以及基本的优化理论。
如果你对上述内容有所欠缺,不必担心!本文将尽量通过代码注释和直观的解释,降低学习门槛,让你能够通过实践逐步掌握Bahdanau注意力的精髓。
接下来,我们将进入Bahdanau注意力机制的详细分析,从理论到代码实现,带你一步步走进深度学习的精彩世界!
2. Bahdanau注意力机制概述
注意力机制简述
在深度学习领域,特别是在序列到序列(Seq2Seq)任务如机器翻译中,注意力机制(Attention Mechanism)是一种革命性的技术,用于解决传统Seq2Seq模型在处理长序列时的瓶颈问题。传统Seq2Seq模型通过编码器将输入序列压缩为一个固定长度的上下文向量,再由解码器基于此向量生成输出序列。然而,当输入序列较长时,固定上下文向量难以充分捕捉所有输入信息,导致信息丢失和翻译质量下降。
注意力机制的提出,允许模型在生成输出时动态地关注输入序列的不同部分,而不是依赖单一的上下文向量。具体来说,注意力机制通过计算输入序列每个位置与当前解码步骤的相关性(注意力权重),为解码器提供一个加权的上下文向量。这种动态聚焦的方式极大地提高了模型对长序列的建模能力,并增强了生成结果的可解释性。
Bahdanau注意力(也称为加性注意力,Additive Attention)是注意力机制的早期代表之一,首次提出于2014年的论文《Neural Machine Translation by Jointly Learning to Align and Translate》。它通过引入一个可学习的对齐模型,动态计算输入序列与输出序列之间的关联,被广泛应用于机器翻译等任务。
加性注意力与乘性注意力对比
注意力机制根据计算注意力得分(Attention Score)的方式不同,可以分为加性注意力和乘性注意力(Dot-Product Attention)两大类:
-
加性注意力(Additive Attention):
-
计算方式:Bahdanau注意力属于加性注意力,其核心是通过将查询(Query)和键(Key)映射到相同的隐藏维度后,相加并通过非线性激活函数(如tanh)处理,最后通过线性变换得到注意力得分。
-
数学表达式:
score ( q , k i ) = w v ⊤ ⋅ tanh ( W q q + W k k i ) \text{score}(q, k_i) = w_v^\top \cdot \tanh(W_q q + W_k k_i) score(q,ki)=wv⊤⋅tanh(Wqq+Wkki)
其中,(q)是查询向量,(k_i)是键向量,(W_q)和(W_k)是可学习的权重矩阵,(w_v)是用于计算最终得分的权重向量。 -
特点:
- 计算复杂度较高,因为需要对查询和键进行线性变换并相加。
- 适合查询和键维度不同的场景,因为它通过映射统一了维度。
- 在Bahdanau注意力中,注意力得分经过softmax归一化,生成权重,用于加权求和值(Value)向量,形成上下文向量。
-
代码体现:
在提供的代码中,AdditiveAttention
类实现了这一过程:queries, keys = self.W_q(queries), self.W_k(keys) features = queries.unsqueeze(2) + keys.unsqueeze(1) features = torch.tanh(features) scores = self.w_v(features).squeeze(-1) self.attention_weights = masked_softmax(scores, valid_lens)
-
-
乘性注意力(Dot-Product Attention):
- 计算方式:乘性注意力通过查询和键的点积直接计算得分,通常在查询和键维度相同时使用。
- 数学表达式:
score ( q , k i ) = q ⊤ k i \text{score}(q, k_i) = q^\top k_i score(q,ki)=q⊤ki
或其缩放版本(Scaled Dot-Product Attention):
score ( q , k i ) = q ⊤ k i d k \text{score}(q, k_i) = \frac{q^\top k_i}{\sqrt{d_k}} score(q,ki)=dkq⊤ki
其中, d k d_k dk是键的维度,用于防止点积过大。 - 特点:
- 计算效率较高,适合大规模并行计算,广泛用于Transformer模型。
- 假设查询和键具有相同的维度,否则需要额外的映射。
- 对于高维输入,可能需要缩放以稳定训练。
- 适用场景:
乘性注意力在Transformer等现代模型中更为常见,但在Bahdanau注意力提出时,RNN-based的Seq2Seq模型更倾向于使用加性注意力,因为它能更好地处理变长序列和不同维度的输入。
对比总结:
- 加性注意力(Bahdanau)通过显式的非线性变换,灵活性更高,适合早期RNN模型,但计算开销较大。
- 乘性注意力(Luong或Transformer)计算简单,效率高,适合现代GPU加速的场景,但在维度不匹配时需要额外处理。
- Bahdanau注意力作为加性注意力的代表,为后续的乘性注意力机制奠定了理论基础。
Bahdanau注意力的数学原理与流程图
数学原理
Bahdanau注意力的核心目标是为解码器的每个时间步生成一个上下文向量,该向量是输入序列隐藏状态的加权和,权重由注意力得分决定。其工作流程可以分解为以下步骤:
-
输入:
- 编码器输出:编码器(通常为GRU或LSTM)处理输入序列,生成隐藏状态序列 ( h 1 , h 2 , … , h T h_1, h_2, \dots, h_T h1,h2,…,hT ),其中 $T $ 是输入序列长度,每个 h i h_i hi是键(Key)和值(Value)。
- 解码器状态:解码器在时间步 t t t的隐藏状态 s t s_t st,作为查询(Query)。
-
注意力得分计算:
- 对于解码器状态 s t s_t st 和每个编码器隐藏状态 h i h_i hi,计算注意力得分:
e t , i = w v ⊤ ⋅ tanh ( W s s t + W h h i ) e_{t,i} = w_v^\top \cdot \tanh(W_s s_t + W_h h_i) et,i=wv⊤⋅tanh(Wsst+Whhi)
其中, W s W_s Ws和 W h W_h Wh是将查询和键映射到隐藏维度的权重矩阵, w v w_v wv是用于生成标量得分的权重向量。
- 对于解码器状态 s t s_t st 和每个编码器隐藏状态 h i h_i hi,计算注意力得分:
-
注意力权重归一化:
- 将得分通过softmax函数归一化为权重:
$\alpha_{t,i} = \frac{\exp(e_{t,i})}{\sum_{j=1}^T \exp(e_{t,j})}
$
其中, α t , i \alpha_{t,i} αt,i表示时间步 t t t 对输入位置 i i i的关注程度,满足 ∑ i α t , i = 1 \sum_i \alpha_{t,i} = 1 ∑iαt,i=1。
- 将得分通过softmax函数归一化为权重:
相关文章:
从代码学习深度学习 - Bahdanau注意力 PyTorch版
文章目录 1. 前言为什么选择Bahdanau注意力本文目标与预备知识2. Bahdanau注意力机制概述注意力机制简述加性注意力与乘性注意力对比Bahdanau注意力的数学原理与流程图数学原理流程图可视化与直观理解3. 数据准备与预处理数据集简介数据加载与预处理1. 读取数据集2. 预处理文本…...
具身智能零碎知识点(三):深入解析 “1D UNet”:结构、原理与实战
深入解析 “1D UNet”:结构、原理与实战 【深度学习入门】1D UNet详解:结构、原理与实战指南一、1D UNet是什么?二、核心结构与功能1. 整体架构2. 编码器(Encoder)3. 解码器(Decoder)4. 跳跃连…...
基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(二)
上一篇 文章介绍了arXiv采集处理的任务背景、整体需求,并对数据进行了调研。 本文介绍整体方案设计。 4.整体方案设计 4.1.总体流程 基于上述调研了解的情况,针对工作需求设计处理流程如下: 下载kaggle数据集作为流程输入,出…...
Halo 设置 GitHub - OAuth2 认证指南
在当今数字化时代,用户认证的便捷性和安全性愈发重要。对于使用 Halo 搭建个人博客或网站的开发者而言,引入 GitHub - OAuth2 认证能够极大地提升用户登录体验。今天,我们就来详细探讨一下如何在 Halo 中设置 GitHub - OAuth2 认证。 一、为…...
脑影像分析软件推荐 | AIDA介绍
目录 1.软件界面 2.工具包功能简介 3.软件安装注意事项 1.软件界面 2.工具包功能简介 AIDAmri是一种新型的基于图谱的成像数据分析流程,用于处理小鼠大脑的结构和功能数据,包括解剖MRI、基于扩散张量成像(DTI)的纤维追踪以及基…...
SQL:Relationship(关系)
目录 🔗 什么是 Relationship? 三种基本关系类型(基于实体间的关系): 1. 一对一(One-to-One) 2. 一对多(One-to-Many) 3. 多对多(Many-to-Many…...
【今日三题】压缩字符串(模拟) / chika和蜜柑(topK) / 01背包
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 压缩字符串 (模拟)chika和蜜柑 (topK)01背包 压缩字符串 (模拟) 压缩字符串 class Solution { public:string compressStri…...
PHP多维数组
在 PHP 中,多维数组是数组的数组,允许你存储和处理更复杂的数据结构。多维数组可以有任意数量的维度,但通常我们最常用的是二维数组(数组中的数组)。 首先来介绍一下一维数组, <?php//一维数组 $strAr…...
智能手机功耗测试
随着智能手机发展,用户体验对手机的续航功耗要求越来越高。需要对手机进行功耗测试及分解优化,将手机的性能与功耗平衡。低功耗技术推动了手机的用户体验。手机功耗测试可以采用powermonitor或者NI仪表在功耗版上进行测试与优化。作为一个多功能的智能终端,手机的功耗组成极…...
0x02.Redis 集群的实现原理是什么?
回答重点 Redis 集群(Redis cluster)是通过多个 Redis 实例组成的,每个主节点实例负责存储部分的数据,并且可以有一个或多个从节点作为备份。 具体是采用哈希槽(Hash Slot)机制来分配数据,将整…...
游戏引擎学习第219天
游戏运行时的当前状态 目前的工作基本上就是编程,带着一种预期,那就是一切都会很糟糕,而我们需要一个系统来防止它变得更糟。接下来,我们来看看目前的进展。 简要说明昨天提到的无限调试信息存储系统 昨天我们完成了内存管理的…...
二叉树深度解析:从基础概念到算法实现与应用
一、二叉树的本质定义与核心特性 (一)递归定义与逻辑结构 二叉树是一种 严格有序的树结构,其递归定义为: 空树:不含任何结点的集合,是二叉树的特殊形态。非空二叉树:由以下三部分组成&#x…...
Model Context Protocol(MCP)模型上下文协议
Model Context Protocol(MCP)模型上下文协议 前言一、什么是MCP二、MCP的作用三、MCP与Function call对比四、构建一个简单的MCP DEMO环境准备实现MCP Server运行 ServerMCP Client端配置验证 总结 前言 在Agent时代,将Agent确立为大模型未来…...
代码随想录算法训练营第十六天
LeetCode题目: 530. 二叉搜索树的最小绝对差501. 二叉搜索树中的众数236. 二叉树的最近公共祖先3272. 统计好整数的数目(每日一题) 其他: 今日总结 往期打卡 530. 二叉搜索树的最小绝对差 跳转: 530. 二叉搜索树的最小绝对差 学习: 代码随想录公开讲解 问题: 给你一个二叉搜…...
类似东郊到家的上门按摩预约服务系统小程序APP源码全开源
🔥 为什么上门按摩正在席卷全国? 万亿蓝海市场爆发 2024年中国按摩市场规模突破8000亿,上门服务增速达65% 90后成消费主力,**72%**白领每月至少使用1次上门按摩(数据来源:艾媒咨询) 传统痛点…...
MySQL 5.7.30 Linux 二进制安装包详解及安装指南
MySQL 5.7.30 Linux 安装包详解 mysql-5.7.30-linux-glibc2.12-x86_64.tar 是 MySQL 服务器 5.7.30 版本的 Linux 二进制发行包。 mysql-5.7.30-linux-glibc2.12-x86_64.tar 安装包下载 链接:https://pan.quark.cn/s/2943cd209ca5 包信息 版本: MySQL 5.7.30 平…...
C语言超详细指针知识(二)
在上一篇有关指针的博客中,我们介绍了指针的基础知识,如:内存与地址,解引用操作符,野指针等,今天我们将更加深入的学习指针的其他知识。 1.指针的使用和传址调用 1.1strlen的模拟实现 库函数strlen的功能是…...
Java集合框架详解:核心类、使用场景与最佳实践
文章目录 一、Java集合框架概览二、核心集合类详解1. List接口(有序、可重复)**ArrayList****LinkedList****List对比表** 2. Set接口(无序、唯一)**HashSet****TreeSet****Set对比表** 3. Queue接口(队列)…...
模板引擎语法-标签
模板引擎语法-标签 文章目录 模板引擎语法-标签[toc]一、用于进行判断的{% if-elif-else-endif %}标签二、关于循环对象的{% for-endfor %}标签三、关于自动转义的{% autoescape-endautoescape %}标签四、关于循环对象的{% cycle %}标签五、关于检查值是否变化的{% ifchange %}…...
刘火良FreeRTOS内核实现与应用学习之7——任务延时列表
在《刘火良FreeRTOS内核实现与应用学习之6——多优先级》的基础上:关键是添加了全局变量:xNextTaskUnblockTime ,与延时列表(xDelayedTaskList1、xDelayedTaskList2)来高效率的实现延时。 以前需要在扫描就绪列表中所…...
基于红外的语音传输及通信系统设计
标题:基于红外的语音传输及通信系统设计 内容:1.摘要 本设计聚焦于基于红外的语音传输及通信系统,以解决传统通信方式在特定场景下的局限性为背景,旨在开发一种高效、稳定且具有一定抗干扰能力的语音传输系统。方法上,采用红外技术作为语音信…...
解锁AI未来,开启创新之旅——《GPTs开发详解》与《ChatGPT 4应用详解》两本书的深度解析
前言 在这个数字化时代,AI技术正在以前所未有的速度改变我们的生活和工作方式。作为一名AI爱好者和从业者,我深知了解并掌握先进技术的重要性。今天,我想向大家推荐两本极具价值的书籍:《GPTs开发详解》和《ChatGPT 4应用详解》。…...
Linux进程通信入门:匿名管道的原理、实现与应用场景
Linux系列 文章目录 Linux系列前言一、进程通信的目的二、进程通信的原理2.1 进程通信是什么2.2 匿名管道通讯的原理 三、进程通讯的使用总结 前言 Linux进程间同通讯(IPC)是多个进程之间交换数据和协调行为的重要机制,是我们学习Linux操作系…...
[SpringMVC]上手案例
创建工程 新建项目,选择maven工程,原型(Archetype)选择maven的webapp,注意名称头尾。会使用到tomcat(因为是javaWeb)。 新建的项目结构目录如下,如果没有java目录,需要自…...
kubernetes 入门篇之架构介绍
经过前段时间的学习和实践,对k8s的架构有了一个大致的理解。 1. k8s 分层架构 架构层级核心组件控制平面层etcd、API Server、Scheduler、Controller Manager工作节点层Kubelet、Kube-proxy、CRI(容器运行时接口)、CNI(网络插件&…...
说一说 Spring 中的事务
什么是事务? 事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。 Spring 中的事务是怎么实现的? Spring事务底层是基于数据库事务和AOP机制的首先对于…...
docker容器安装的可道云挂接宿主机的硬盘目录:解决群晖 威联通 飞牛云等nas的硬盘挂接问题
基于Docker部署可道云(KodCloud)时,通过挂载宿主机其他磁盘目录可实现高效、安全的数据管理。具体而言,使用绑定挂载(Bind Mounts)将宿主机目录(如/data/disk2)映射到容器内的可道云…...
Oracle 23ai Vector Search 系列之5 向量索引(Vector Indexes)
文章目录 Oracle 23ai Vector Search 系列之5 向量索引Oracle 23ai支持的向量索引类型内存中的邻居图向量索引 (In-Memory Neighbor Graph Vector Index)磁盘上的邻居分区矢量索引 (Neighbor Partition Vector Index) 创建向量索引HNSW索引IVF索引 向量索引示例参考 Windows 环…...
GPT模型架构与文本生成技术深度解析
核心发现概述 本文通过系统分析OpenAI的GPT系列模型架构,揭示其基于Transformer解码器的核心设计原理与文本生成机制。研究显示,GPT模型通过自回归机制实现上下文感知的序列生成,其堆叠式解码器结构配合创新的位置编码方案,可有效…...
【读者求助】如何跨行业进入招聘岗位?
文章目录 读者留言回信岗位细分1. 中介公司的招聘岗位2. 猎头专员3. 公司的招聘专员选择建议 面试建议1. 请简单介绍你过去 3 年的招聘工作经历,重点说下你负责的岗位类型和规模2. 你在招聘流程中最常用的渠道有哪些?如何评估渠道效果?3. 当你…...
2025蓝桥杯省赛C++B组解题思路
由于题面还没出来,现在先口胡一下思路 填空题直接打表找规律或者乱搞一下就能出,从大题开始说。 1,题意: 给你一个数组,这个数组里有几个数可以被一个连续递增的数字区间求和得出 思路:诈骗题,显…...
springcloud整理
问题1.服务拆分后如何进行服务之间的调用 我们该如何跨服务调用,准确的说,如何在cart-service中获取item-service服务中的提供的商品数据呢? 解决办法:Spring给我们提供了一个RestTemplate的API,可以方便的实现Http请…...
游戏引擎学习第220天
介绍 今天的工作主要是进行一些代码整理和清理,目的是将我们之前写过的代码重新整合在一起,使它们能够更好地协同工作。现在的阶段,我们的任务并不是进行大规模的功能开发,而是集中精力对现有的代码进行整合和思考,确…...
OceanBase企业版单机部署:obd命令行方式
OceanBase企业版单机部署:obd命令行方式 安装包准备服务器准备最低资源配置是否部署ODP组件?仲裁服务器 服务器配置操作系统内核参数BIOS设置磁盘挂载网卡设置 obd部署前配置obd部署单机版安装obd配置obd部署OB集群部署后检查 环境清理与集群销毁 本文介…...
KWDB创作者计划—KWDB认知引擎:数据流动架构与时空感知计算的范式突破
引言:数据智能的第三范式 在数字化转型进入深水区的2025年,企业数据系统正面临三重悖论:数据规模指数级增长与实时决策需求之间的矛盾、多模态数据孤岛与业务连续性要求之间的冲突、静态存储范式与动态场景适配之间的鸿沟。KWDB(K…...
车载通信系统中基于ISO26262的功能安全与抗辐照协同设计研究
摘要:随着智能网联汽车的快速发展,车载通信系统正面临着功能安全与抗辐照设计的双重挑战。在高可靠性要求的车载应用场景下,如何实现功能安全标准与抗辐照技术的协同优化,构建满足ISO26262安全完整性等级要求的可靠通信架构&#…...
Oracle OCP认证考试考点详解083系列03
题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 11. 第11题: 题目 解析及答案: 关于 RMAN(恢复管理器)多路复用备份集,以下哪…...
Spring
一.Ioc&DI 1.类的五种控制反转注解 这五个注解作用都一样,只是意义不一样,用来提高代码的可读性。 Controller:控制层,接收请求,对请求进⾏处理,并进⾏响应。 Servie:业务逻辑层࿰…...
基于开源链动2+1模式、AI智能名片与S2B2C商城小程序源码的体验式关系深化与商业转化研究
摘要:本文探讨了通过体验过程中的共同经历强化关系,促使KOC(关键意见消费者)为品牌背书的机制,并深入分析了开源链动21模式、AI智能名片以及S2B2C商城小程序源码在其中的创新应用。研究发现,这些新模式和技…...
【区块链安全 | 第三十九篇】合约审计之delegatecall(一)
文章目录 外部调用函数calldelegatecall call 与 delegatecall 的区别示例部署后初始状态调用B.testCall()函数调用B.testDelegatecall()函数区别总结 漏洞代码代码审计攻击代码攻击原理解析攻击流程修复建议审计思路 外部调用函数 在 Solidity 中,常见的两种底层外…...
Kingbase 常用运维命令总结
一、数据库连接与基础操作 连接指定服务器数据库 ksql -h 主机IP -p 端口号 -U 用户名 -d 数据库名 -W # 示例:连接 IP 为 192.168.1.100 的数据库 ksql -h 192.168.1.100 -p 54321 -U system -d test -W 断开数据库连接 \q 或 exit 查看数据库列表及详细信息…...
从零开始的C++编程 2(类和对象下)
目录 1.构造函数初始化列表 2.类型转换 3.static成员 4.友元 5.内部类 6.匿名对象 1.构造函数初始化列表 ①之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,初始化…...
Java---抽象类与接口
抽象类与接口 前言一、抽象类1.抽象类的概念2.抽象类的语法3.抽象类的特点4.抽象类的操作5.抽象类的作用 二、接口1.接口的概念2.接口语法3.接口的使用与特性4.实现多个接口5.接口之间的继承6.接口的实例(1).对象大小的比较(1).Comparable接口(2).Comparator接口 (2).实现类的克…...
玩转Docker | 使用Docker部署linkding书签管理工具
玩转Docker | 使用Docker部署linkding书签管理工具 前言一、linkding介绍简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署linkding服务下载镜像创建容器检查容器状态检查服务端口设置登录账号与密码安全设置四、访问linkding服务访问linkding…...
K8s 集群网络疑难杂症:解决 CNI 网络接口宕机告警的完整指南
引言 在 Kubernetes 集群运维过程中,网络问题往往是最棘手的故障之一。当你收到一条 [CRITICAL] 网络接口宕机 (172.18.109.55:9100) 的告警,并且告警内容显示 172.18.109.55:9100 的网络接口 cni0 已宕机5分钟 时,这通常意味着你的 Kubernetes 集群中有一个节点的容器网络…...
程序员/运维绘图工具---Mermaid
效果 介绍 Mermaid 是一种基于文本的图表生成工具,通过类似 Markdown 的简洁语法快速创建流程图、甘特图、类图等各类专业图表 应用场景 程序员绘图 系统架构图&代码逻辑可视化 项目管理图 数据可视化 AI辅助生成:LLM生成mermaid代码然后去渲染成…...
《MATLAB实战训练营:从入门到工业级应用》趣味入门篇-用MATLAB画一朵会动的3D玫瑰:从零开始的浪漫编程之旅
《MATLAB实战训练营:从入门到工业级应用》趣味入门篇-🌹用MATLAB画一朵会动的3D玫瑰:从零开始的浪漫编程之旅 你是否想过用代码创造一朵永不凋谢的玫瑰?今天,我将带你走进MATLAB的奇妙世界,用数学公式和编…...
激光院董事长龚赤坤到北京研发中心检查指导工作
4月11日,激光院党委书记、董事长龚赤坤到北京研发中心检查指导工作。 龚赤坤详细了解了北京研发中心的建设情况和科研进展,充分肯定所取得的成绩,对发展寄予厚望,龚赤坤指出北京研发中心的成立正处于激光院加速发展与产业进化的关…...
AbortController:让异步操作随时说停就停
AbortController:让异步操作随时说停就停 一、什么是 AbortController? AbortController 是 JavaScript 在浏览器和部分 Node.js 环境中提供的全局类,用来中止正在进行或待完成的异步操作(如 fetch() 请求、事件监听、可写流、数…...
leetcode572 另一棵树的子树
1.与100、101解法相同 递归: class Solution { private:bool compare(TreeNode* p, TreeNode* q){if(!p && !q) return true;else if(!p || !q) return false;else if(p->val ! q->val) return false;bool leftside compare(p->left, q->lef…...