论文阅读:A Generalization of Transformer Networks to Graphs

news2024/11/16 21:27:38

论文阅读:A Generalization of Transformer Networks to Graphs

  • 论文地址
  • 1 摘要
  • 2 贡献
  • Graph Transformer
    • On Graph Sparsity(图稀疏)
    • On Positional Encodings(位置编码)
    • 3 Graph Transformer Architecture(架构)
      • 模型框架
      • input(输入)
    • Graph Transformer Layer
      • Graph Transformer Layer with edge features(带边特征)
      • 基于任务的 MLP 层
  • 4 实验

论文地址

论文:https://arxiv.org/pdf/2012.09699.pdf
代码:https://github.com/graphdeeplearning/graphtransformer

1 摘要

作者提出了一种适用于任何图的GraphTransformer。原始的transformer在基于单词的全连接图上用于NLP,它有如下缺点:

  1. 这种结构不能很好利用图的连通归纳偏置(graph connectivity inductive bias)
  2. 当图的拓扑结构很重要且尚未编码到节点特征时,表现很差

作者提出的GraphTransformer,有4个优势:

  1. 注意力机制是图中每个节点的邻域连通性的函数
  2. positional encoding用拉普拉斯特征向量表示
  3. Batch Normalization代替Layer Normalization,优点:训练更快,泛化性能更好
  4. 该架构扩展到边特征表示,这对于某些任务可能至关重要,例如化学(键类型)或链接预测(知识图谱中的实体关系)

2 贡献

  1. 提出了一种将 transformer 网络推广到任意结构的同构图,即 Graph Transformer,以及具有边缘特征的 GraphTransformer 的扩展版本,允许使用显式域信息作为边缘特征。
  2. 方法包括一种使用拉普拉斯特征向量为图数据集融合节点位置特征的优雅方法。与文献的比较表明,拉普拉斯特征向量比任何现有的方法都更适合编码任意同构图的节点位置信息
  3. 实验表明,所提出的模型超过了baseline的各向同性和各向异性 GNN

Graph Transformer

On Graph Sparsity(图稀疏)

在NLP的transformer中,用全连接图去处理一个句的原因:

  1. 很难在句子中的单词之间找到有意义的稀疏交互或联系。例如:句子中的单词对另一个单词的依赖性可能因上下文、用户视角而异
  2. NLP的transformer的nodes数量比较少(几十个,几百个),便于计算。

对于实际的图形数据集,图形可能有任意的连接结构,nodes的数量高达数百万或数十亿,使得不可能为此类数据集提供完全连接的图形,因此需要Graph Transformer来让nodes处理邻居信息。

On Positional Encodings(位置编码)

在 NLP 中,基于 transformer 的模型为每个单词提供位置编码。确保每个单词的唯一表示并确保最终保留距离信息

对于图形,唯一节点位置的设计具有挑战性,因此大多数在图数据集上训练的 GNN 学习的是不随节点位置变化的结构化节点信息,这就是为什么GAT是局部attention,而不是全局attention。

现在的目标是学习结构和位置的特征,Dwivedi et al. (2020)利用现有的图结构预先计算拉普拉斯特征向量,并将它们作为节点的位置信息。

  • 拉普拉斯 PE 能更好地帮助编码距离感知信息(即,附近的节点具有相似的位置特征,而较远的节点具有不同的位置特征)

因此使用拉普拉斯特征向量作为 Graph Transformer 中的 PE。特征向量通过图拉普拉斯矩阵的分解来定义:
Δ = I − D − 1 / 2 A D − 1 / 2 = U T Λ U , ( 1 ) \Delta=\mathrm{I}-D^{-1/2}AD^{-1/2}=U^T\Lambda U,\quad(1) Δ=ID1/2AD1/2=UTΛU,(1)

  • A A A n × n n\times n n×n邻接矩阵, D D D是度矩阵
  • Λ \Lambda Λ U U U分别对应特征值和特征向量
  • 使用节点的 k个最小的非平凡特征向量作为其位置编码,对于节点 i i i,用 λ i \lambda_{i} λi表示

3 Graph Transformer Architecture(架构)

模型框架

在这里插入图片描述

input(输入)

首先准备要输入Graph Transformer Layer的input node 和 edge embeddings。

在图 G \mathcal{G} G中,对于任意一个节点 i i i的节点特征 α i ∈ R d n × 1 \alpha_{i} \in \mathbb{R}^{d_{n}\times1} αiRdn×1以及节点 i i i和节点 j j j之间的边特征 β i j ∈ R d e × 1 \beta_{ij}\in\mathbb{R}^{d_{e}\times1} βijRde×1 α i \alpha_{i} αi β i j \beta_{ij} βij通过一个线性映射,从而嵌入到 d d d维的隐藏特征(hidden features) h i 0 h_i^0 hi0 e i j 0 e_{ij}^0 eij0中,公式如下:
h ^ i 0 = A 0 α i + a 0 ; e i j 0 = B 0 β i j + b 0 , ( 2 ) \hat{h}_i^0=A^0\alpha_i+a^0 ; e_{ij}^0=B^0\beta_{ij}+b^0,\quad(2) h^i0=A0αi+a0;eij0=B0βij+b0,(2)

  • 其中 A 0 ∈ R d × d n , B 0 ∈ R d × d e A^0\in\mathbb{R}^{d\times d_n},B^0\in\mathbb{R}^{d\times d_e} A0Rd×dn,B0Rd×de,以 A 0 A^0 A0为例,其每一列是每个节点的节点特征(总共 d n d_n dn个结点),维度为 d d d,而 α i \alpha_{i} αi一个其他元素都为0,对应节点位置的元素为1的向量

  • a 0 , b 0 ∈ R d a^0,b^0\in\mathbb{R}^d a0,b0Rd是线性映射层的参数

然后通过线性映射嵌入维度为 k k k的预计算节点位置编码并将其添加到节点特征 h ^ i 0 \hat{h}_i^0 h^i0中。
λ i 0 = C 0 λ i + c 0 ; h i 0 = h ^ i 0 + λ i 0 , ( 3 ) \lambda_i^0=C^0\lambda_i+c^0 ; h_i^0=\hat{h}_i^0+\lambda_i^0,\quad(3) λi0=C0λi+c0;hi0=h^i0+λi0,(3)

  • 其中 C 0 ∈ R d × k , c 0 ∈ R d C^0\in\mathbb{R}^{d\times k},c^0\in\mathbb{R}^d C0Rd×kc0Rd,其作用是将位置编码转化为维度为 d d d的向量

Graph Transformer Layer

现在定义第 l l l层的节点更新方程:
h ^ i ℓ + 1 = O h ℓ ∣ ∣ k = 1 H ( ∑ j ∈ N i w i j k , ℓ V k , ℓ h j ℓ ) , ( 4 ) \hat{h}_{i}^{\ell+1}=O_{h}^{\ell}\mathcal{\left|\right|}_{k=1}^{H}\Big(\sum_{j\in\mathcal{N}_{i}}w_{ij}^{k,\ell}V^{k,\ell}h_{j}^{\ell}\Big),\quad(4) h^i+1=Ohk=1H(jNiwijk,Vk,hj),(4)
w h e r e ,   w i j k , ℓ = s o f t m a x j ( Q k , ℓ h i ℓ ⋅ K k , ℓ h j ℓ d k ) , ( 5 ) \mathrm{where,~}w_{ij}^{k,\ell}=\mathrm{softmax}_{j}\Big(\frac{Q^{k,\ell}h_{i}^{\ell} \cdot K^{k,\ell}h_{j}^{\ell}}{\sqrt{d_{k}}}\Big),\quad(5) where, wijk,=softmaxj(dk Qk,hiKk,hj),(5)

  • Q k , ℓ , K k , ℓ , V k , ℓ ∈ R d k × d , O h ℓ ∈ R d × d Q^{k,\ell},K^{k,\ell},V^{k,\ell}\in\mathbb{R}^{d_{k}\times d},O_{h}^{\ell}\in\mathbb{R}^{d\times d} Qk,,Kk,,Vk,Rdk×d,OhRd×d
  • k = 1 k=1 k=1 H H H代表注意头的数量
  • ∣ ∣ \mathcal{\left|\right|} 表示串联(concatenation)

这里详细讲一下式子(5), Q k , ℓ h i ℓ Q^{k,\ell}h_{i}^{\ell} Qk,hi相当于 h i ℓ h_{i}^{\ell} hi的查询向量, K k , ℓ h j ℓ K^{k,\ell}h_{j}^{\ell} Kk,hj h j ℓ h_{j}^{\ell} hj的键向量(相当于查询的答案)

  • 比如,查询向量在问:“我前面有形容词吗”,键向量回答:“有的”。假设二者向量点积值越大,则说明了它们越匹配,则说明越相关
  • 除以 d k \sqrt{d_{k}} dk 是为了数据的稳定性

接着将结果 h ^ i ℓ + 1 \hat{h}_{i}^{\ell+1} h^i+1按照框架图所示依次经过残差连接和LN、Feed Forward Network (FFN)、残差连接和LN,公式如下:
h ^ ^ i ℓ + 1 = Norm ( h i ℓ + h ^ i ℓ + 1 ) , ( 6 ) h ^ ^ ^ ℓ + 1 = W 2 ℓ ReLU ( W 1 ℓ h ^ ^ i ℓ + 1 ) , ( 7 ) h i ℓ + 1 = Norm ( h ^ ^ i ℓ + 1 + h ^ ^ ^ i ℓ + 1 ) , ( 8 ) \hat{\hat{h}}_i^{\ell+1}\quad=\quad\text{Norm}\Big(h_i^\ell+\hat{h}_i^{\ell+1}\Big),\quad(6) \newline \begin{array}{lcl}\hat{\hat{\hat{h}}}^{\ell+1}&=&W_2^\ell\text{ReLU}(W_1^\ell\hat{\hat{h}}_i^{\ell+1}),&(7)\end{array} \newline \begin{array}{rcl}h_i^{\ell+1}&=&\text{Norm}\Big(\hat{\hat{h}}_i^{\ell+1}+\hat{\hat{\hat{h}}}_i^{\ell+1}\Big),&\quad(8)\end{array} h^^i+1=Norm(hi+h^i+1),(6)h^^^+1=W2ReLU(W1h^^i+1),(7)hi+1=Norm(h^^i+1+h^^^i+1),(8)

  • W 1 ℓ , ∈ R 2 d × d , W 2 ℓ , ∈ R d × 2 d , h ^ ^ i ℓ + 1 , h ^ ^ ^ i ℓ + 1 W_{1}^{\ell},\in \mathbb{R}^{2d\times d}, W_{2}^{\ell},\in \mathbb{R}^{d\times2d}, \hat{\hat{h}}_{i}^{\ell+1}, \hat{\hat{\hat{h}}}_{i}^{\ell+1} W1,R2d×d,W2,Rd×2d,h^^i+1,h^^^i+1 都是中间变量
  • Norm可以是LayerNorm或者BatchNorm

Graph Transformer Layer with edge features(带边特征)

接下来介绍的是上图第二个模型,根据公式(5),将此分数视为边<i,j>的隐式信息,紧接着使用公式(12)为边<i,j>注入可用的边信息,如下:
h ^ i ℓ + 1 = O h ℓ ∣ ∣ k = 1 H ( ∑ j ∈ N i w i j k , ℓ V k , ℓ h j ℓ ) , (9) e ^ i j ℓ + 1 = O e ℓ ∣ ∣ k = 1 H ( w ^ i j k , ℓ ) , w h e r e , (10) w i j k , ℓ = s o f t m a x j ( w ^ i j k , ℓ ) , (11) w ^ i j k , ℓ = ( Q k , ℓ h i ℓ ⋅ K k , ℓ h j ℓ d k ) ⋅ E k , ℓ e i j ℓ , (12) \begin{aligned}&\hat{h}_{i}^{\ell+1}&&=\quad O_{h}^{\ell}\mathcal{\left|\right|}_{k=1}^{H}\Big(\sum_{j\in\mathcal{N}_{i}}w_{ij}^{k,\ell}V^{k,\ell}h_{j}^{\ell}\Big),&&\text{(9)}\\&\hat{e}_{ij}^{\ell+1}&&=\quad O_{e}^{\ell}\mathcal{\left|\right|}_{k=1}^{H}\Big(\hat{w}_{ij}^{k,\ell}\Big), \mathrm{where},&&\text{(10)}\\&w_{ij}^{k,\ell}&&=\quad\mathrm{softmax}_{j}(\hat{w}_{ij}^{k,\ell}),&&\text{(11)}\\&\hat{w}_{ij}^{k,\ell}&&=\quad\left(\frac{Q^{k,\ell}h_{i}^{\ell}\cdot K^{k,\ell}h_{j}^{\ell}}{\sqrt{d_{k}}}\right) \cdot E^{k,\ell}e_{ij}^{\ell},&&\text{(12)}\end{aligned} h^i+1e^ij+1wijk,w^ijk,=Ohk=1H(jNiwijk,Vk,hj),=Oek=1H(w^ijk,),where,=softmaxj(w^ijk,),=(dk Qk,hiKk,hj)Ek,eij,(9)(10)(11)(12)

  • Q k , ℓ , K k , ℓ , V k , ℓ , E k , ℓ ∈ R d k × d , O h ℓ , O e ℓ ∈ R d × d Q^{k,\ell},K^{k,\ell},V^{k,\ell},E^{k,\ell} \in \mathbb{R}^{d_{k}\times d}, O_{h}^{\ell},O_{e}^{\ell} \in \mathbb{R}^{d\times d} Qk,,Kk,,Vk,,Ek,Rdk×d,Oh,OeRd×d
  • 这里的公式,矩阵运算过程中总感觉维度不对应,后期再看这个问题

紧接着,经历相同的过程,如下:
对于节点:
h ^ ^ i ℓ + 1 = N o r m ( h i ℓ + h ^ i ℓ + 1 ) , (13) h ^ ^ ^ i ℓ + 1 = W h , 2 ℓ R e L U ( W h , 1 ℓ h ^ ^ i ℓ + 1 ) , (14) h i ℓ + 1 = N o r m ( h ^ ^ i ℓ + 1 + h ^ ^ ^ i ℓ + 1 ) , (15) \begin{aligned} &\hat{\hat{h}}_{i}^{\ell+1}&& =\quad\mathrm{Norm}\Big(h_{i}^{\ell}+\hat{h}_{i}^{\ell+1}\Big), &&&& \text{(13)} \\ &\hat{\hat{\hat{h}}}_{i}^{\ell+1}&& =\quad W_{h,2}^{\ell}\mathrm{ReLU}(W_{h,1}^{\ell}\hat{\hat{h}}_{i}^{\ell+1}), &&&& \text{(14)} \\ &h_{i}^{\ell+1}&& =\quad\mathrm{Norm}\Big(\hat{\hat{h}}_{i}^{\ell+1}+\hat{\hat{\hat{h}}}_{i}^{\ell+1}\Big), &&&& \text{(15)} \end{aligned} h^^i+1h^^^i+1hi+1=Norm(hi+h^i+1),=Wh,2ReLU(Wh,1h^^i+1),=Norm(h^^i+1+h^^^i+1),(13)(14)(15)

  • W h , 1 ℓ , ∈ R 2 d × d , W h , 2 ℓ , ∈ R d × 2 d W_{h,1}^{\ell},\in \mathbb{R}^{2d\times d}, W_{h,2}^{\ell},\in \mathbb{R}^{d\times2d} Wh,1,R2d×d,Wh,2,Rd×2d

对于边:
e ^ ^ i j ℓ + 1 = N o r m ( e i j ℓ + e ^ i j ℓ + 1 ) , ( 16 ) e ^ ^ ^ i j ℓ + 1 = W e , 2 ℓ R e L U ( W e , 1 ℓ e ^ ^ i j ℓ + 1 ) , ( 17 ) e i j ℓ + 1 = N o r m ( e ^ ^ i j ℓ + 1 + e ^ ^ ^ i j ℓ + 1 ) , ( 18 ) \hat{\hat{e}}_{ij}^{\ell+1}=\quad\mathrm{Norm}\Big(e_{ij}^{\ell}+\hat{e}_{ij}^{\ell+1}\Big),(16)\\\hat{\hat{\hat{e}}}_{ij}^{\ell+1}=\quad W_{e,2}^{\ell}\mathrm{ReLU}(W_{e,1}^{\ell}\hat{\hat{e}}_{ij}^{\ell+1}),(17)\\e_{ij}^{\ell+1}=\quad\mathrm{Norm}\Big(\hat{\hat{e}}_{ij}^{\ell+1}+\hat{\hat{\hat{e}}}_{ij}^{\ell+1}\Big),(18) e^^ij+1=Norm(eij+e^ij+1),(16)e^^^ij+1=We,2ReLU(We,1e^^ij+1),(17)eij+1=Norm(e^^ij+1+e^^^ij+1),(18)

  • W e , 1 ℓ , ∈ R 2 d × d , W e , 2 ℓ , ∈ R d × 2 d W_{e,1}^{\ell},\in \mathbb{R}^{2d\times d},W_{e,2}^{\ell},\in \mathbb{R}^{d\times2d} We,1,R2d×d,We,2,Rd×2d

基于任务的 MLP 层

在 Graph Transformer 最后一层获得的节点表示被传递到基于任务的 MLP 网络,用于计算与任务相关的输出,然后将其馈送到损失函数以训练模型的参数

4 实验

为了评估提出的模型的性能,在ZINC,PATTERN,CLUSTER这三个数据集实验。

  • ZINC, Graph Regression:分子数据集,node代表分子,edge代表分子之间的键。键之间有丰富的特征信息,所以用第二个模型。
  • PATTERN,Node Classification:任务是把nodes分成两个communities,没有明确的edge信息,所以用第一个模型。
  • CLUSTER, Node Classification:任务是为每个node分配cluster,一共有6个cluster,用第一个模型。

模型的配置:使用PyTorch,DGL。一共有10层Graph Transformer layers,每层有8个attention head和随机隐藏单元,学习率递减策略,当学习率达到 1 0 − 6 10^{-6} 106就停止训练。使用 4 种不同的种子进行每个实验,并报告 4 次运行的平均值和平均性能测量值。
表1如下:

  • GraphTransformer (GT) 在所有数据集上的结果。 ZINC 的性能测量是 MAE,PATTERN 和 CLUSTER的性能测量是 Acc。 结果(除了 ZINC 之外,所有结果都越高越好)是使用 4 种不同种子进行 4 次运行的平均值。
  • 粗体:每个数据集表现最佳的模型。
  • 使用给定的图(稀疏图)和(完整图)执行每个实验,其中完整图在所有节点之间创建完全连接;对于 ZINC 全图,边特征被丢弃。
    在这里插入图片描述
    表2如下所示:
    每个数据集上的最佳表现分数(来自表 1)与 GNN baselines的比较
    在这里插入图片描述
    实验结论如下:
  • 由表1可知,带有PE和BN的模型实验数据更好。
  • 由表2可知,提出的模型明显比GCN和GTN要好,但没有GatedGCN好。
  • 提出的第二个模型的性能在ZINC上近似于GatedGCN。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT实现联网,NextChat插件的配置说明

简介 NextChat开源版本已支持插件调用。 不过&#xff0c;插件的配置略复杂&#xff0c;为了降低普通用户的配置难度&#xff0c;本文基于中转API做详细配置说明&#xff0c;后续如果有新增插件&#xff0c;本文也将同步更新配置说明。 在配置具体插件之前&#xff0c;你需要…

Spring后端直接用枚举类接收参数,自定义通用枚举类反序列化器

在使用枚举类做参数时&#xff0c;一般会让前端传数字&#xff0c;后端将数字转为枚举类&#xff0c;当枚举类很多时&#xff0c;很可能不知道这个code该对应哪个枚举类。能不能后端直接使用枚举类接收参数呢&#xff0c;可以&#xff0c;但是受限。 Spring反序列默认使用的是J…

The NCCoE’s Automation of the CMVP

Earlier today at the ICMC24, we heard from a panel about the US National Cybersecurity Center of Excellence’s (NCCoE) work on the Automated Cryptographic Module Validation Program (ACMVP), which intends to tackle the troublingly long queue times we’ve se…

Apifox 「定时任务」操作指南,解锁自动化测试的新利器

定时任务是按照预设时间自动执行的任务&#xff0c;它可以有效解决一些常见问题&#xff0c;比如频繁执行的回归测试和大规模的接口测试&#xff0c;这些任务需要在固定时间点或间隔周期内自动运行&#xff0c;以确保软件的持续集成和持续交付过程中的稳定性和可靠性。通过使用…

实操学习——个人资料的录入、修改、密码的修改

实操学习——个人资料的录入、修改、密码的修改 一、个人资料的录入和修改知识补充&#xff1a;装饰器二、密码的修改知识补充&#xff1a;docker的关闭与启动 一、个人资料的录入和修改 在users的app下创建一个用户详情表 from django.contrib.auth.models import User from…

C/C++逆向:switch语句逆向分析

在逆向分析中&#xff0c;switch语句会被编译器转化为不同的底层实现方式&#xff0c;这取决于编译器优化和具体的场景。常见的实现方式包括以下几种&#xff1a; ①顺序判断&#xff08;if-else链&#xff09;&#xff1a; 编译器将switch语句转化为一系列的if-else语句。这…

【第十四章:Sentosa_DSML社区版-机器学习时间序列】

目录 【第十四章&#xff1a;Sentosa_DSML社区版-机器学习时间序列】 14.1 ARIMAX 14.2 ARIMA 14.3 HoltWinters 14.4 一次指数平滑预测 14.5 二次指数平滑预测 【第十四章&#xff1a;Sentosa_DSML社区版-机器学习时间序列】 14.1 ARIMAX 1.算子介绍 考虑其他序列对一…

Flutter鸿蒙化(windows)

Flutter鸿蒙化&#xff08;windows&#xff09; 参考资料Window配置Flutter的鸿蒙化环境下载配置环境变量HarmonyOS的环境变量配置配置Flutter的环境变量Flutter doctor -v 检测的问题flutter_flutter仓库地址的警告问题Fliutter doctor –v 报错[!] Android Studio (version 2…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-18

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-18 1. The Application of Large Language Models in Primary Healthcare Services and the Challenges W YAN, J HU, H ZENG, M LIU, W LIANG - Chinese General Practice, 2024 人工智能大语言模型在基层医疗…

软媒市场新探索:软文媒体自助发布,开启自助发稿新篇章

在繁华喧嚣的软媒市场中,每一个声音都在竭力呼喊,每一个品牌都在奋力展现。而软文,作为一种温柔而坚韧的营销力量,正逐渐崭露头角。特别是软文媒体自助发布平台的出现,更是为企业提供了一个全新的、高效的自助发稿渠道。 软媒市场自助发布平台,正如其名,是一个让企业能够自主发…

离职员工客户如何管理?解锁2024企业微信新功能

公司里员工来来去去很正常&#xff0c;但每次有人走&#xff0c;老板们都会头疼&#xff0c;因为客户信息得有人接着管。客户对公司来说太重要了&#xff0c;不能丢。2024年&#xff0c;企业微信出了个新招&#xff0c;就是员工离职后&#xff0c;客户信息可以轻松转给新来的员…

JVM的基本概念

目录 一、JVM的内存划分 二、JVM的类加载过程 三、JVM的垃圾回收机制&#xff08;GC&#xff09; 四、分代回收 一、JVM的内存划分 一个运行起来的Java进程&#xff0c;就是一个Java虚拟机&#xff0c;就需要从操作系统中申请一大块内存。申请的内存会划分为不同的区域&…

Maven笔记(一):基础使用【记录】

Maven笔记&#xff08;一&#xff09;-基础使用 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构 Maven提供了一套标准化的项目结构&#xff0c;所有IDE(eclipse、myeclipse、IntelliJ IDEA 等 项目开发工具) 使…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17 1. Large Language Models in Biomedical and Health Informatics: A Review with Bibliometric Analysis H Yu, L Fan, L Li, J Zhou, Z Ma, L Xian, W Hua, S He… - Journal of Healthcare …, 2024 生物…

HarmonyOS应用开发(组件库)--组件模块化开发、工具包、设计模式(持续更新)

致力于&#xff0c;UI开发拿来即用&#xff0c;提高开发效率 正则表达式...手机号校验...邮箱校验 文件判断文件是否存在 网络下载下载图片从沙箱中图片转为Base64格式从资源文件中读取图片转Base64 组件输入框...矩形输入框...输入框堆叠效果&#xff08;用于登录使用&#xf…

【自动驾驶】决策规划算法(二)参考线模块Ⅰ| 平滑算法与二次规划

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

(学习记录)使用 STM32CubeMX——GPIO引脚输入配置

STM32F103C8T6的GPIO引脚输入配置 时钟配置 &#xff08;学习记录&#xff09;使用 STM32CubeMX——配置时钟&#xff08;入门&#xff09;https://blog.csdn.net/Wang2869902214/article/details/142423522 GPIO 引脚输出配置 &#xff08;学习记录&#xff09;使用 STM32…

Springcloud框架-能源管理系统-能源管理系统源码-能源在线监测平台-双碳平台

一、介绍 基于SpringCloud的能管管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 有需者咨询&#xff0c;非诚勿扰&#xff1b; 二、软件架构 二、功能介绍 三、数字大屏展示 四、数据采集原理 五、软件截图

macos pyenv 安装python tk 、tkinter图形库方法步骤和使用总结

在macos中&#xff0c; pyenv 是一款用来管理多版本python 的工具&#xff0c; 我们常用的tk图形库是一个独立的工具库&#xff0c;我们在python里面使用的tkinter模块仅是调用这个独立的tk图形库&#xff0c; 所以如果我们希望在python里面使用它&#xff0c; 就必须要先安装t…

委托的注册及注销+观察者模式

事件 委托变量如果公开出去&#xff0c;很不安全&#xff0c;外部可以随意调用 所以取消public,封闭它&#xff0c;我们可以自己书写两个方法&#xff0c;供外部注册与注销&#xff0c;委托调用在子方法里调用&#xff0c;这样封装委托变量可以使它更安全&#xff0c;这个就叫…