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

【intro】GraphSAGE

论文

https://arxiv.org/pdf/1706.02216

abstract

大图中节点的低维embedding已经被证明在各种预测任务中非常有用,然而,大多数现有的方法要求在embedding训练期间图中的所有节点都存在;这些先前的方法属于直推式(transductive),不能自然地推广到看不见的节点。这里我们介绍GraphSAGE,一个通用的归纳式(inductive)框架,它利用节点特征信息(例如,文本属性)来有效地为以前未见过的数据生成节点embedding。

这里再整理一下之前提到的GCN和GAT,其中GCN是属于inductive还是transductive似乎都各有簇拥,这里可以参考这篇问答

How GCN can be an inductive method? - #2 by czkkkkkk - Questions - Deep Graph Library

引用这里的一个对话:

- we say GraphSAGE is inductive because it can use sampling methods to predict the label of unseen nodes. On the contrary, GCN is transductive because the graph structure is fixed.

-  Okay I’m confused… Why is there many articles stating that GCN is an inductive learning framework ?

And, even two of you collaborators think it is inductive, check this post How to carry out the batch-wise training while using layer defined in DGL? - Questions - Deep Graph Library 5 (neo and mufeili).
You can also see on this website : Graph Neural Networks (snap-stanford.github.io) 9 which comes from Stanford university and where Jure Leskovec teaches this course, that GCN has an inductive capacity.

From my point of view, I think we can use GCN as an inductive method because it does not change the shape of weight matrixes when we add a new node to the graph. We just need to do get the node’ neighbors times their features times the learned weight matrixes. In the wend we just have to pass GCN(A[new_nodes], X, W_learned), with A[new_nodes] the line allowing to get the node’ neighbors, X the feature matrix and W_learned all the matrixes learned during the training of the model.

I am really confused as you can see, beacause some say it is transductive, others say it is inductive. I know that originally it was tested in an transductive setting, but many sources accord to say it can be used inductively. Maybe it is because everyone does not have the same definition of transductive and inductive, yet they are straightforward definitions…

In the end, I just want to know if a GCN model can, from a node totally unseen (not masked, really unseen) during the training, generate an embedding for this unseen node ?
At the end of my GCN, I want to classify my node as 1 or 0, so I just put a linear layer with a sigmoid activation function.

Thank you for your clarification.

- Thanks for your interest in such a discussion. My understand may not be totally correct since I am not a GNN algorithm expertise. Here are my thoughts. Full graph GCN is not inductive because it only is applied for the whole graph and makes predictions for nodes that can be seen during training. Sampling-based GraphSAGE is inductive because it is able to apply sampling on unseen nodes. So the difference is whether sampling is applied or not. If sampling is available, both GCN and SAGE models can conduct inductive learning.

neural network - What is the model architectural difference between transductive GCN and inductive GraphSAGE? - Data Science Stack Exchange

a

- The main novelty of GraphSAGE is a neighborhood sampling step (but this is independent of whether these models are used inductively or transductively). You can think of GraphSAGE as GCN with subsampled neighbors.

In practice, both can be used inductively and transductively.

The title of the GraphSAGE paper ("Inductive representation learning") is unfortunately a bit misleading in that regard. The main benefit of the sampling step of GraphSAGE is scalability (but at the cost of higher variance gradients).

- GraphSage provides a solution to address the problem DeepWalk embedding technique. As we know that DeepWalk embedding technique use transudative learning to extract features from a graph. If a node is added in the graph then we gain re-run the algorithm to get embedding of all node. So, DeepWalk besed GNN is not suitable for dynamic graphs where the nodes in the graphs are ever-changing. To address the above-mentioned issue, GraphSage is introduced to learn the node representation in inductive way. Specifically, each node is represented by the aggregation of its neighborhood. Thus, even if a new node unseen during training time appears in the graph, it can still be properly represented by its neighboring nodes.

You can learn more following blog: https://towardsdatascience.com/a-gentle-introduction-to-graph-neural-network-basics-deepwalk-and-graphsage-db5d540d50b3

为什么GCN是Transductive的? - 知乎

总结来说就是最原始的方法看起来就是transductive的,但是也可以某种程度上认为是inductivde的。

GAT就没什么疑问了,属于铁inductive了。

introduction

对于一个大图,低维的向量embedding用于特征输入已经被证明在大量的预测和图分析任务中非常有用了。这些在节点embedding方法背后的基本思想都是使用降维技术将节点图邻域的高维信息提取成密集的向量嵌入。然后,这些节点嵌入可以馈送到下游机器学习系统,并帮助完成节点分类、聚类和链接预测等任务。

然而,以前的工作主要集中在从单个固定图中嵌入节点,并且许多现实世界的应用需要为未见过的节点或全新的(子)图快速生成embedding。生成节点embedding的归纳方法也有助于具有相同特征形式的图的泛化:例如,可以在源自模式生物的蛋白质-蛋白质相互作用图上训练embedding生成器,然后使用训练好的模型轻松地为收集到的新生物数据生成节点嵌入。

GraphSAGE (SAmple and aggreGatE),用于归纳节点嵌入。与基于矩阵分解的embedding方法不同,GraphSAGE利用节点特征(例如,文本属性、节点概要信息、节点度)来学习一个embedding函数,该函数可以推广到不可见的节点。通过在学习算法中加入节点特征,可以同时学习到每个节点邻域的拓扑结构以及节点特征在邻域中的分布。

GraphSAGE没有为每个节点训练一个不同的embedding向量,而是训练了一组聚合器函数,这些函数学习从节点的局部邻域聚合特征信息(图1)。每个聚合器函数从远离给定节点的不同跳数或搜索深度聚合信息。在测试或推理时,使用训练好的系统通过应用学习到的聚合函数来生成完全不可见节点的embedding。

原始的GCN算法是为transductive环境下的半监督学习而设计的,精确的算法要求在训练过程中知道完整的图拉普拉斯。GraphSAGE算法的一个简单变体可以看作是GCN框架到归纳设置的扩展。

proposed method: GraphSAGE

关键思想:如何从节点的邻居那里聚合信息(比如周围节点的度、文本属性)。

embedding generation(i.e., forward propagation) algorithm

假设我们已经训练好模型了,即假设我们已经学到K聚合函数(记作AGGREGATE_k, \forall k \in \{1, \cdot \cdot \cdot , K \})的参数了,这里聚合的信息来源于节点的邻居,同样还学到了一系列权重矩阵(记作W^k, \forall k \in \{1,\cdot \cdot \cdot ,K \}),用于在模型的不同层或“搜索深度”之间传播信息。

algorithm 1背后的直觉是,在每次迭代或搜索深度时,节点聚集来自其本地邻居的信息,并且随着该过程的迭代,节点逐渐从图的进一步到达处获得越来越多的信息。

algorithm 1描述的是当整张图(G=(V,E))、所有节点的特征(x_v, \forall v \in V)被提供给输入时,产生embedding的过程。

关于邻居的定义:在这篇论文中,同一采样固定大小的邻域,而不是像algorithm 1 那样使用所有的邻居->这样就可以保证每个batch的计算量固定。->把N(v)定义成一个固定大小的、统一的集合\{u \in V: (u,v) \in \varepsilon \}的采样,然后我们在每次迭代的时候,都抽取不同的统一的sample(个人理解这里的不同指的是节点不同,这里的统一指的是类似归一化之后的结果)

learning the parameters of GraphSAGE

为了在一个完全非监督的设置下学习有用的、可以预测的表示,对输出表示(应该就是指embedding)采用graph-based的损失函数z_u, \forall u \in V,用来微调权重矩阵W^k, \forall k \in \{ 1, \cdot \cdot \cdot , K \},通过随机梯度下降调整聚合函数的参数。这一graph-based损失函数让相邻的节点能有类似的表示(这个好像还挺常见的,比较general的GNN似乎就是希望相邻的节点更相似),同时强制每个节点的表示是与众不同的。

J_G(z_u) = -log(\sigma (z_u^T z_v))-Q\cdot \mathbb{E}_{v_n \sim P_{n(v)}} log(\sigma (-z_u^T z_{v_n}))

这里v是一个出现在节点u固定长度的random walk的附近的节点,\sigma是sigmoid函数,P_{n}表示负样本分布,Q表示负样本的个数。与之前的embedding方法不同,我们放到损失函数中的z_u表示是由节点的局部邻域中包含的特征生成的,而不是为每个节点训练唯一的embedding。

aggregator

节点的邻居没有自然的顺序;因此,algorithm 1中的聚合函数必须在一个无序的向量集合上操作。理想情况下,聚合器函数应该是对称的(即,其输入的不变操作),同时仍然是可训练的,并保持较高的表示能力。聚合函数的对称性保证了我们的神经网络模型可以训练并应用于任意有序的节点邻域特征集。

论文介绍了三种聚合器:mean aggregator,LSTM aggregator,pooling aggregator。

mean aggregator

\{ h_u^{k-1} , \forall u \in N(v) \}中向量的元素均值。mean聚合器几乎等同于在tranductive GCN框架中使用的卷积传播规则。可以通过用以下代码替换algorithm 1中的第4行和第5行,推导出GCN方法的归纳变体:

h_v^k \leftarrow \sigma(W\cdot MEAN(\{ h_v ^{k-1}\} \cup \{ h_u^{k-1}, \forall u \in N(v) \} ))

称这种改进的基于均值的聚合器为卷积,因为它是局部谱卷积的粗略线性逼近,这个卷积聚合器和我们提出的其他聚合器之间的一个重要区别是,它不执行算法第5行中的连接操作。->这种卷积聚合器连接了节点在前一层的表示h_v^{k-1}以及聚合的邻居向量h_{N(v)} ^ k。这种连接可以被看作是GraphSAGE在不同的“搜索深度(search depths)”或者“层(layers)”之间的一种简单的“skip-connection”

LSTM aggregator

基于LSTM架构的更复杂的聚合器。与均值聚合器相比,lstm具有更强的表达能力。然而,重要的是要注意lstm不是固有对称的(即,它们不是排列不变的),因为它们以顺序的方式处理它们的输入。通过简单地将lstm应用于节点邻居的随机排列,使得lstm能够在无序集合上运行

pooling aggregator

pooling 聚合器是对称的、可训练的在这种池化方法中,每个邻居的向量通过全连接神经网络独立馈送,在此转换之后,对跨邻居集的聚合信息应用元素最大池操作:

AGGREGATE_k^{pool} = max( \{ \sigma(\textbf{W}_{pool} \mathbf{h}_{u_i}^k + \mathbf{b} ) , \forall u_i \in N(v) \} )

这里的max是元素层面上的求最大值,\sigma是非线性激活函数。原则上,在最大池化之前应用的函数可以是任意深度的多层感知器,但我们在这项工作中专注于简单的单层架构。通过对每个计算特征应用max-pooling算子,该模型有效地捕获了邻域集的不同方面。还要注意的是,原则上,任何对称向量函数都可以用来代替最大算子(例如:(元素的均值)。文章指出在实验中没有发现最大值和均值之间显著的区别,因此文章中采用的是最大值方法。

附录mini batch的伪代码。

下面是附录一些其他的博客中比较值得关注的内容

GraphSage 算法原理介绍与源码浅析_珍妮的算法之路-CSDN博客

GraphSage 属于 Inductive learning 算法, 它学习一种聚合函数, 通过聚合节点邻居的特征信息来学习目标节点本身的 embedding 表达. 它的主要步骤就记录在它的名字中: Sample 与 Aggregate. 其中 Sample 阶段通过随机采样获取多跳邻居; Aggregate 阶段聚合邻居节点特征生成目标节点自身的 embedding. 以聚合 2 跳邻居为例, 它将首先聚合 2 跳邻居的特征生成 1 跳邻居的 embedding, 之后再聚合 1 跳邻居的 embedding 来生成节点本身的 embedding. 由于生成 1 跳邻居 embedding 时, 已经包含了 2 跳邻居的特征信息, 此时目标节点也将获得 2 跳邻居的特征信息. 论文中的图示形象地展示了这一过程:

官方开源代码:GitHub - williamleif/GraphSAGE: Representation learning on large graphs using stochastic graph convolutions.

采样:

采样时按照k=K,\cdot \cdot \cdot , 1进行,聚合时按照k=1,\cdot \cdot \cdot ,K进行

这篇博客的作者在这里给了非常详细的图解,请直接移步原博客阅读。

图神经网络10-GraphSAGE论文全面解读 - 知乎

上面是为红色的目标节点生成embedding的过程。k表示距离目标节点的搜索深度,k=1就是目标节点的相邻节点,k=2表示目标节点相邻节点的相邻节点。 对于上图中的例子:

  • 第一步是采样,k=1采样了3个节点,对k=2采用了5个节点;
  • 第二步是聚合邻居节点的信息,获得目标节点的embedding;
  • 第三步是使用聚合得到的信息,也就是目标节点的embedding,来预测图中想预测的信息;

GraphSAGE的目标是基于参数h的相邻节点的某种组合来学习每个节点的表示形式。 

稍微回顾下,Graph中的每个节点都可以拥有自己的特征向量,该特征向量由X节点特征得到。现在让我们假设每个节点的所有特征向量都具有相同的大小。一层GraphSAGE可以运行k次迭代-因此,每k次迭代,每个节点都有一个节点表示h。

因为每个节点都可以由它们的邻居近似表示,所以节点的嵌入可以用其邻近节点嵌入向量的某种组合来表示。 通过一轮GraphSAGE算法,我们将获得节点A的新表示形式。原始图中的所有节点都遵循相同的过程。

步骤1 Aggregate

aggregator 的作用是把一个向量的集合转换成向量,也就是聚合。和其他机器学习任务中的数据(如图像,文本等)不同,图中的节点是没有顺序的(node’s neighbors have no natural ordering),aggregator function操作的是一个无序的向量集合\{ h_u^{k-1} , \forall u \in N(v) \}。其中N(v)代表了节点v的邻居节点集合。 这篇文章尝试了多种aggregator function: 

  • Mean aggregator:显然对向量集合,对应元素取均值是最直接的想法。
  • LSTM aggregator:和mean aggregator相比,LSTM有更大的表达能力。但是LSTM不符合symmetric的性质,输入是有顺序的。所以把相邻节点的向量集合随机打乱顺序,然后作为LSTM的输入。
  • Pooling aggregator:尝试了pooling做aggregator, 所有相邻节点的向量共享权重,先经过一个非线性全连接层,然后做max-pooling.

GraphSAGE算法遵循两步过程。由于它是迭代的,因此存在一个初始化步骤,该步骤将所有初始节点嵌入向量设置为其特征向量。(k从1…K开始迭代)

步骤2 Update

在基于节点v的邻居获得聚合表示后,请使用其先前表示和聚合表示的组合来更新当前节点v。该f_update功能为任何可微函数,可以再次,是一样简单的平均函数,或复杂如神经网络。

根据节点v的邻域聚合表示和节点v的先前表示,为节点v创建更新的表示:

(讲道理,读到这里觉得有一个问题,按照这么划分,那么应该是三个步骤,第一步不应该是做sample吗?然后又有了一个新问题,这里的sample是一旦指定就固定了还是每次迭代都要重新sample呢?我倾向于会随机sample,毕竟输入可能是没有顺序的。

源码中写的是“Assumes that adj lists are padded with random re-sampling”所以我也更倾向于自己的理解,求同存异吧)

GraphSAGE:我寻思GCN也没我牛逼 - 知乎

去学习一个节点的信息是怎么通过其邻居节点的特征聚合而来的。 学习到了这样的“聚合函数”,而我们本身就已知各个节点的特征和邻居关系,我们就可以很方便地得到一个新节点的表示了。

GCN等transductive的方法,学到的是每个节点的一个唯一确定的embedding; 而GraphSAGE方法学到的node embedding,是根据node的邻居关系的变化而变化的,也就是说,即使是旧的node,如果建立了一些新的link,那么其对应的embedding也会变化,而且也很方便地学到。

假设我们要聚合K次,则需要有K个聚合函数(aggregator),可以认为是N层。 每一次聚合,都是把上一层得到的各个node的特征聚合一次,在假设该node自己在上一层的特征,得到该层的特征。如此反复聚合K次,得到该node最后的特征。 最下面一层的node特征就是输入的node features。

(好图)

(好图*2)

设置一个定值,每次选择邻居的时候就是从周围的直接邻居(一阶邻居)中均匀地采样固定个数个邻居。虽然在聚合时仅仅聚合了一个节点邻居的信息,但该节点的邻居,也聚合了其邻居的信息,这样,在下一次聚合时,该节点就会接收到其邻居的邻居的信息,也就是聚合到了二阶邻居的信息了。

在GraphSAGE的实践中,作者发现,K不必取很大的值,当K=2时,效果就灰常好了,也就是只用扩展到2阶邻居即可。至于邻居的个数,文中提到S1×S2<=500,即两次扩展的邻居数之际小于500,大约每次只需要扩展20来个邻居即可

(这篇文章的评论区也很值得看,请移步原文)

其他:

【Graph Neural Network】GraphSAGE: 算法原理,实现和应用 - 知乎

[论文笔记]:GraphSAGE:Inductive Representation Learning on Large Graphs 论文详解 NIPS 2017_graphsage: inductive graph representation learning-CSDN博客

相关文章:

【intro】GraphSAGE

论文 https://arxiv.org/pdf/1706.02216 abstract 大图中节点的低维embedding已经被证明在各种预测任务中非常有用&#xff0c;然而&#xff0c;大多数现有的方法要求在embedding训练期间图中的所有节点都存在;这些先前的方法属于直推式&#xff08;transductive&#xff09…...

管理能力学习笔记九:授权的常见误区和如何有效授权

授权的常见误区 误区一&#xff1a;随意授权 管理者在授权工作时&#xff0c;需要依据下属的能力、经验、意愿问最自己&#xff1a;这项工作适合授权给Ta做吗&#xff1f;如果没有&#xff0c;可以通过哪些方法进行培训呢&#xff1f; 误区二&#xff1a;缺乏信任 心理暗示…...

第21天 反射

反射概述 想象一下&#xff0c;你在一个房间里边&#xff0c;但你看不见自己&#xff0c;也不知道自己是谁。这时候你面前有一个镜子&#xff0c;你可以通过镜子的反射来观察自己。反射就像这面镜子。它让你能够检查、分析、修改Java中的对象、类、方法等 使用情况&#xff1…...

多链路聚合设备是什么

多链路聚合设备属于通信指挥装备。 乾元通多链路聚合设备&#xff0c;它能够将多个网络链路聚合成一个逻辑链路&#xff0c;以实现高速、稳定、可靠的数据传输。多链路聚合设备的核心技术包括链路聚合、负载均衡、故障切换等&#xff0c;能够智能管理和优化利用不同网络链路&a…...

基于springboot+vue+Mysql的自习室预订系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

解决后端ID传到前端时被截断,末尾显示00

问题原因&#xff1a; Java后端Long类型的取值和前端Number类型取值范围不一样。 解决方案&#xff1a; 将id字段进行json序列化时转为字符串。 JsonSerialize(using ToStringSerializer.class) private Long id;...

Transformer中的数据输入构造

文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容&#xff1a; Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…...

完美实现vue3异步加载组件

经过几个小时的努力&#xff0c;终于实现了&#xff0c;根据组件名异常加载组件&#xff0c;直接上代码&#xff0c;网上的很多代码方都有坑&#xff0c;先贴出比较坑的代码&#xff1a; <template><view class"main"> <view class"tops"…...

点云成图原理

点成图&#xff08;Point Cloud&#xff09;是指由一组离散的点构成的图形&#xff0c;它们在空间中没有任何连接关系。点成图通常是由激光雷达、相机或其他传感器获取的三维数据&#xff0c;用于表示现实世界中的物体或场景。 三角成图&#xff08;Triangulation&#xff09;…...

如何将jsp项目转成springboot项目

昨天说过&#xff0c;springboot推荐使用Thymeleaf作为前后端渲染的模板引擎&#xff0c;为什么推荐用Thymeleaf呢&#xff0c;有以下几个原因&#xff1a; 动静结合&#xff1a;Thymeleaf支持HTML原型&#xff0c;允许在HTML标签中增加额外的属性来实现模板与数据的结合。这样…...

C语言:环形链表

1.例子1&#xff1a;环形链表 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;我们先定义两个变量slow和fast&#xff0c;slow每次走一步&#xff0c;fast每次走两步&#xff0c;如果链表是环形链表&#xff0c;那么必定存在fast不会走到链表的最后…...

typescript综合练习1(展开音乐播放列表)

Playlist Soundness What’s up, friend?! I’m so pumped you’re joining us. We’ve got a sick project we could totally use your help on! See, someone’s giving us amazing recommendations for songs to play. But they’re not just coming in as songs. Someti…...

零基础入门学习Python第二阶02面向对象,迭代器生成器,并发编程

Python语言进阶 面向对象相关知识 三大支柱&#xff1a;封装、继承、多态 例子&#xff1a;工资结算系统。 """月薪结算系统 - 部门经理每月15000 程序员每小时200 销售员1800底薪加销售额5%提成"""from abc import ABCMeta, abstractmethodcl…...

Unity | Shader基础知识(第十三集:编写内置着色器阶段总结和表面着色器的补充介绍)

目录 前言 一、表面着色器的补充介绍 二、案例viewDir详解 1.viewDir是什么 2.viewDir的作用 3.使用viewDir写shader 前言 注意观察的小伙伴会发现&#xff0c;这组教程前半部分我们在编写着色器的时候&#xff0c;用的是顶点着色器和片元着色器的组合。 SubShader{CGPRO…...

JavaScript map对象/set对象详解

文章目录 一、map对象二、map对象应用场景1. 数组元素转换2. 对象数组的属性提取或转换3. 数组元素的复杂转换4. 与其他数组方法结合使用5. 与异步操作结合&#xff08;使用 Promise&#xff09;6. 生成新的数据结构7. 数学和统计计算 三、set对象1. 基本使用2. 特性3. 注意事项…...

【kettle017】kettle访问DB2数据库并处理数据至execl文件(最近完善中)

1.一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下DB2数据库&#xff08;IBM公司开发的一套关系型数据库管理系统&#xf…...

Spring Cloud原理详解和作用特点

当涉及到构建和管理分布式系统的微服务架构时&#xff0c;Spring Cloud 是一个备受欢迎的选择。它提供了一套强大的工具和组件&#xff0c;使开发者能够轻松地构建、部署和管理微服务应用程序。本文将深入探讨 Spring Cloud 的原理和作用特点。 1. Spring Cloud 的原理 Sprin…...

Linux —— 进程间通信

目录 一、进程间通信的介绍二、管道三、匿名管道四、命名管道五、system V进程间通信 一、进程间通信的介绍 1.进程间通信的概念 进程通信&#xff08;Interprocess communication&#xff09;&#xff0c;简称&#xff1a;IPC&#xff1b; 本来进程之间是相互独立的。但是…...

ASP.NET信息安全研究所设备管理系统的设计与实现

摘 要 以研究所的设备管理系统为背景&#xff0c;以研究所设备管理模式为研究对象&#xff0c;开发了设备管理系统。设备管理系统是设备管理与计算机技术相结合的产物&#xff0c;根据系统的功能需求分析与定义的数据模式&#xff0c;分析了应用程序的主要功能和系统实现的主…...

<网络安全>《81 微课堂<安全产品微简介(1)>》

1 简单的了解复杂的安全产品 产品简要防火墙网络区域边界上部署&#xff0c;主要作用是隔离阻断。安全审计一般包括网络日志的分析、网络流量的监控和用户行为的跟踪等。发现网络中的潜在问题和漏洞。入侵检测IDS实时监控和检测网络中的异常活动和入侵行为。入侵防御IPS防病毒…...

【6D位姿估计】FoundationPose 跑通demo 训练记录

前言 本文记录在FoundationPose中&#xff0c;跑通基于CAD模型为输入的demo&#xff0c;输出位姿信息&#xff0c;可视化结果。 然后分享NeRF物体重建部分的训练&#xff0c;以及RGBD图为输入的demo。 1、搭建环境 方案1&#xff1a;基于docker镜像&#xff08;推荐&#xf…...

Python 中 “yield“ 的不同行为

在我们使用Python编译过程中&#xff0c;yield 关键字用于定义生成器函数&#xff0c;它的作用是将函数变成一个生成器&#xff0c;可以迭代产生值。yield 的行为在不同的情况下会有不同的效果和用途。 1、问题背景 在 Python 中&#xff0c;“yield” 是一种生成器&#xff0…...

迅睿CMS中实现关键词搜索高亮

在迅睿CMS系统中实现关键词搜索高亮是提升用户体验和搜索效果的重要手段。当用户搜索某个关键词时&#xff0c;将搜索结果中的关键词高亮显示&#xff0c;可以帮助用户更快速地定位到所需信息。 关键词高亮的实现 在迅睿CMS中&#xff0c;你可以使用内置的dr_keyword_highlig…...

晶振的精度与稳定性有什么关系?

晶振的精度和稳定性是电子设备中非常重要的参数&#xff0c;它们受到多种因素的影响&#xff0c;主要包括&#xff1a; 精度的影响因素&#xff1a; 温度变化&#xff1a;晶体的温度系数会使得频率随温度变化而变化&#xff0c;通常在0C到55C的工业标准温度范围内&#xff0c;…...

【C】137 只出现一次的数字

给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 解法一 #include <stdio.h>int singleNumber(i…...

51单片机入门:DS1302时钟

51单片机内部含有晶振&#xff0c;可以实现定时/计数功能。但是其缺点有&#xff1a;精度往往不高、不能掉电使用等。 我们可以通过DS1302时钟芯片来解决以上的缺点。 DS1302时钟芯片 功能&#xff1a;DS1302是一种低功耗实时时钟芯片&#xff0c;内部有自动的计时功能&#x…...

Redis-5 分布式锁

一.为什么要使用分布式锁&#xff1f; 传统的互斥锁synchronized只能作用于同一台虚拟机上的线程&#xff0c;在使用服务器集群部署的情况下&#xff0c;互斥锁就会失效&#xff0c;因此要采用分布式锁来处理不同服务器上的线程访问同一资源的情况。 二.redis的分布式锁是如何…...

音转文工具,9.8k star! 【送源码】

我们经常会遇到将音频转为文字的情况&#xff0c;比如在开会时录音的会议纪要、上课时录下的老师讲课内容。虽然网上也有一些在线的工具可以将音频转为文字&#xff0c;但是考虑到数据安全和费用问题&#xff0c;使用起来也不是很方便。 今天了不起给大家介绍一款开源工具——…...

【首次发布】华为 OD 机试 C卷抽中题库清单(真题库),目前华为OD机考以C卷为主,特殊情况会发送D卷

本篇博客为大家整理华为 OD 考友反馈 C 卷抽中题&#xff0c;经过 1 个的考友复盘&#xff0c;目前已经收录 100 题目&#xff0c;预计在有 2 周可以收集完整。 所有题目&#xff0c;都有考友截图反馈&#xff0c;同时欢迎大家机考过后&#xff0c;提供橡皮擦真题&#xff0c;获…...

【进程等待】waitpid的参数pid | status的位图位操作WIFEXITEDWEXITSTATUS宏

目录 waitpid pid status status位图 status按位操作 输入型参数和输入型参数 宏WIFEXITED&WEXITSTATUS options&非阻塞等待 上篇进程等待我们介绍到怎样去进程等待。我们介绍了wait函数&阻塞等待。本篇我们将介绍waitpid函数的参数pid和status。 waitp…...

做网站 报价/百度推广首页

关于绘图颜色1R语言绘图之 颜色 grDevice 包- colorRamp() 和 colorRampPalette()- 颜色名字可使用 colors() 获取 RColorBrewer 包- 三类调色板&#xff1a;sequential&#xff1a;从一个极端渐变到另一个极端&#xff0c;适合用于呈现顺序数据2. diverging&#xff1a;两端鲜…...

网站建设价钱/贵州二级站seo整站优化排名

嵌入式介绍与应用1 概念桌面对比2 特点3 发展历史3.1 计算机发展3.2 嵌入式发展4 开发能力要求5 应用6 规模参考1 概念 嵌入式系统由硬件和软件组成。是能够独立进行运作的器件。其软件内容只包括软件运行环境及其操作系统。硬件内容包括信号处理器、存储器、通信模块等在内的…...

男男做爰视频网站/如何百度收录自己的网站

问题描述 如果你在WCF中用Entity Framework来获取数据并返回实体对象&#xff0c;那么对下面的错误一定不陌生。 接收对 http://localhost:5115/ReService.svc 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。 这还可能是由于服务器中止了 HTTP …...

设计网站国外网站/百度云搜索

快速启动终端: ctraltt终端字体放大: ctrshift终端字体缩小: ctr-ls: 查看当前目录的下文件信息pwd: 查看当前目录的路径touch: 创建文件mkdir: 创建文件夹rmdir&#xff1a; 删除空文件夹rm: 默认删除的是文件&#xff0c; -r表示以递归的方式删除文件夹里面的所有文件信息最后…...

重庆千牛建设工程有限公司网站/整站优化

uwsgi 文档 uwsgi 安装 pip3 install uwsgi ini 配置方法 在 ini 配置文件里增加一个 home 或 pyhome 或 virtualenv 或 venv 参数 指向 virtualenv 根目录&#xff1a; (blog) [rootVM_2_29_centos ~]# uwsgi --help | grep virtualenv Usage: /root/.virtualenvs/blog/bin/uw…...

江门站官网/写一篇推广商品的软文

生活中虽然有难过的事情&#xff0c;但是要微笑面对哦&#xff01;下面是由出国留学网编辑为大家整理的“关于难过的作文400字”&#xff0c;仅供参考&#xff0c;欢迎大家阅读。关于难过的作文400字(一)星期六下午&#xff0c;我到妈妈的“第一时间”快餐店的办公室玩&#xf…...