当前位置: 首页 > 编程日记 > 正文

一文读懂简化的图卷积网络GCN(SGC)| ICML 2019

640?wx_fmt=jpeg

作者 | yyl424525
来源 | CSDN博客

文章目录
1 相关介绍
1.1 Simple Graph Convolution (SGC)提出的背景
1.2 SGC效果
2 Simple Graph Convolution 简化的图卷积
2.1 符号定义
2.2 图卷积网络GCN
  • GCN vs MLP

  • Feature propagation 特征传播

  • Feature transformation and nonlinear transition

  • 分类器

2.3 简化的图卷积SGC
  • 线性化

  • 逻辑回归

  • 优化细节

3 谱分析
3.1 在图上的初步做法
3.2 SGC and Low-Pass Filtering 简化的图卷积和低通滤波器
4 相关工作
4.1 图神经网络
4.2 其他在图上的工作
graph embedding methods
5 实验结果
5.1 Citation Networks & Social Networks
  • Performance

  • Efficiency

5.2 下游任务
Text classification
Semi-supervised user geolocation
Relation extraction
Zero-shot image classification
Graph classification

论文:Simplifying Graph Convolutional Networks 简化的图卷积网络GCN(SGC)

作者:Felix Wu, Tianyi Zhang, Amauri Holanda de Souza Jr., Christopher Fifty, Tao Yu, Kilian Q. Weinberger
来源:ICML 2019

论文链接:
https://arxiv.org/abs/1902.07153v1
Github代码链接:
https://github.com/Tiiiger/SGC

GCN在学习图的表示方面已经引起了广泛的关注,应用也非常广泛。GCNs的灵感主要来自最近的一些深度学习方法,因此可能会继承不必要的复杂度和冗余计算。文中通过反复消除GCN层之间的非线性并将得到的函数折叠成一个线性变换来减少GCNs的额外复杂度。并从理论上分析了得到的线性模型SGC,并证明了SGC相当于一个固定的低通道滤波器和一个线性分类器。实验结果表明,这些简化不会对许多下游应用的准确性产生负面影响。此外,得到的SGC模型可扩展到更大的数据集,并且比FastGCN产生两个数量级的加速。

1 相关介绍

1.1 Simple Graph Convolution (SGC)提出的背景

传统的机器学习方法的复杂度变化趋势都是从简单到复杂。例如从线性Perceptron到非线性MLP,从简单的线性图片filters到CNN都是这个趋势。GCN也是源于传统的机器学习方法,继承了这个复杂度的变化。此文的目的就是要把非线性的GCN转化成一个简单的线性模型SGC,通过反复消除GCN层之间的非线性并将得到的函数折叠成一个线性变换来减少GCNs的额外复杂度。

SGC中的特征提取等价在每个特征的维度上应用了单个固定的filter。

1.2 SGC效果

实验表明

  • 这种简化了的线性SGC模型在很多任务上比GCN和一些其他GNN网络更高效,并且参数更少

  • 并且在效率方面,在Reddit数据集上比FastGCN快两个数量级

  • SGC在文本分类、用户地理定位、关系提取和zero-shot图像分类任务方面,即使不能超越基于GCN的方法,但至少也是竞争对手

2 Simple Graph Convolution 简化的图卷积

2.1 符号定义

640?wx_fmt=png

数据集中只知道部分节点的标签,目标是预测未知的节点的标签。

2.2 图卷积网络GCN

GCN vs MLP

GCNs和MLPs相似,都是通过多层网络学习一个节点的特征向量Xi,然后再把这个学到的特征向量送入的一个线性分类器中进行分类任务。一个k层GCN与k 层MLP在应用于图中每个节点的特征向量Xi是相同的,不同之处在于每个节点的隐藏表示在每一层的输入时是取的它的邻居的平均。

每个图中的卷积层和节点表示都是使用三个策略来更新
  • 特征传播

  • 线性转换

  • 逐点非线性激活

640?wx_fmt=png

Feature propagation 特征传播

GCN的特征传播是区别MLP的,因为每一层的输入都是节点局部邻居的平均值:
640?wx_fmt=png(2)

用一个简单的矩阵运算来表示公式(2)的更新:

640?wx_fmt=png(3)

  • S表示添加自循环“normalized”的邻接矩阵(实际上并没有归一化)

  • A˜=A+1是A \mathbf{A}A的度矩阵

  • D˜是A的度矩阵


用公式(2)对所有节点进行同时更新,得到了一个简单的稀疏矩阵乘法:

640?wx_fmt=png(4)

这一步平滑了沿着图的边的局部隐藏表示,并最终支持在局部连接的节点之间进行类似的预测。

Feature transformation and nonlinear transition

在局部平滑之后,一个GCN层就等于一个标准的MLP。每一个层对应一个可学习的权重矩阵640?wx_fmt=png,所以平滑处理了的隐藏特征表示是线性转换的(后面乘一个参数矩阵是线性的)。最后在逐节点应用一个非线性激活函数,例如ReLU就可以得到输出的特征表示

640?wx_fmt=png(5)

分类器

对于节点分类任务,最后一层和MLP相似,都是使用一个softmax分类器预测节点的标签,一个K KK层的GCN的所有节点的类别预测可以写作:
640?wx_fmt=png(6)

640?wx_fmt=png

2.3 简化的图卷积SGC

在传统的MLP中,层数变深加强了网络的表达能力,因为它允许创建特征的层次结构,例如,第二层的特征构建在第一层特征的基础上。在GCNs中,每一层都有一个重要的函数:在每一层中,隐藏的表示在1跳距离的邻居之间求平均值。这意味着在k kk层之后,一个节点从图中所有k kk跳的节点处获得特征信息。这种效果类似于卷积神经网络,深度增加了内部特征的感受野。虽然卷积网络可以在层数加深时提升性能(Deep networks with stochastic depth, 2016),但通常MLP的深度只限于为3至4层。

线性化

假设GCN层之间的非线性不是最关键的,最关键的是局部邻居的平均聚合操作。因此,考虑删除每层之间的非线性转换函数(如ReLU),只保留最终的softmax(以获得概率输出)。得到的模型是线性的

640?wx_fmt=png(7)

简化如下

640?wx_fmt=png(8)

640?wx_fmt=png

这个简化的版本就叫做Simple Graph Convolution (SGC)。

逻辑回归

公式(8)给了SGC的一个自然直观的解释:SGC由两部分组成

  • 一个固定的(没有参数,parameter-free)的特征提取器(或平滑器smoothing component)640?wx_fmt=png

  • 特征提取器后是一个线性逻辑回归分类器640?wx_fmt=png

可以看出,由于计算不需要权值,因此可以把这部分计算作为特征的预处理步骤,整个模型的训练可以直接简化为对预处理特征的多类逻辑回归。

优化细节

逻辑回归的训练是一个凸优化问题,可以用任何有效的二阶方法或随机梯度下降法进行执行(Large-scale machine learning with stochastic gradient descent,2010)。在图连通模式足够稀疏的情况下,SGD可以很自然地运用在非常大的图上,SGC的训练比GCN快得多。

3 谱分析

文中从图卷积的角度来研究SGC,并证明了SGC在图谱域上对于应一个固定的滤波器。此外,还证明了在原始图上添加自循环,即renormalization trick,可以有效地缩小底层图的谱。在这个缩放的谱域上,SGC充当一个低通滤波器,在图上生成平滑的特征。因此,邻居节点倾向于共享相似的表示,从而实现预测。

3.1 在图上的初步做法

经过傅里叶变换的信号x和滤波器g的GCN卷积操作为

640?wx_fmt=png(11)

推导过程可以看GCN原始论文:Semi-Supervised Classification with Graph Convolutional Networks用图卷积进行半监督分类

最后,通过将卷积推广到d dd维的通道输入中的多个滤波器上,并在每一层之间用非线性激活函数的分层模型,就得到了如公式(5)所定义的GCN传播规则

640?wx_fmt=png(5)

3.2 SGC and Low-Pass Filtering 简化的图卷积和低通滤波器

定理1

对于一个简单,没有孤立节点的无向图。令640?wx_fmt=png分别是对称归一化的拉普拉斯矩阵640?wx_fmt=png640?wx_fmt=png的最小和最大的特征值。640?wx_fmt=png的最小和最大的特征值。则有

640?wx_fmt=png(12)

关于定理1的证明,可参考文中提供的附录部分。

从定理1可以看出,当γ>0 \gamma>0γ>0时,相当于图中添加了自循环,则归一化的拉普拉斯矩阵的最大特征值会变小。

640?wx_fmt=png

图2描述了在Cora数据集上使用的三种情况下特征值(频率)的变化和滤波器系数(谱系数)的变化关系

640?wx_fmt=png


4 相关工作

4.1 图神经网络

  • Spectral networks and locally connected networks on graphs,ICML 2014-首次提出了一个扩展到图上的基于谱图理论的CNN网络

  • Convolutional neural networks on graphs with fast localized spectral filtering,NIPS 2016-通过使用切比雪夫多项式近似消除了拉普拉斯矩阵分解带来的巨大的计算开销,定义了图卷积

  • Semi-supervised classification with graph convolutional networks,ICLR 2017-通过使用预先定义的传播矩阵S SS进行一阶切比雪夫近似,极大的降低了图卷积的计算,正式提出GCN

  • Inductive representation learning on large graphs(GraphSAGE),NIPS 2017-Hamilton等人提出了一个inductive的图卷积,使用固定邻居size采样,然后进行邻居特征聚合

  • Diffusion-convolutional neural networks,NIPS 2016;;NGCN: Multi-scale graph convolution for semi-supervised node classification,2018;Lanczosnet: Multi-scale deep graph convolutional networks,ICLR 2019-利用多尺度信息,将邻接矩阵S SS提升到更高的阶

  • How powerful are graph neural networks?,ICLR 2019-研究L图神经网络对任意两个图的区分能力,并引入图同构网络,证明其与图同构的Weisfeiler-Lehman检验同样强大

  • Predict then propagate: Graph neural networks meet personalized pagerank,ICLR 2019-利用神经网络和个性化随机游走将非线性变换与传播分离

  • Attention-based graph neural network for semisupervised learning,2018-提出了基于注意力机制的GCN

  • A simple yet effective baseline for non-attribute graph classification,2018-提出了一种有效的基于节点度统计信息进行图分类的线性baseline

  • Bootstrapped graph diffusions: Exposing the power of nonlinearity,2018-结果表明,使用线性特征/标签传播步骤的模型可以从自训练策略中提升效果

  • Label efficient semi-supervised learning via graph filtering,CVPR 2019-提出了一种广义的标签传播,并提供了一个类似谱分析的renormalization trick

  • Graph Attention Networks,ICLR 2018;Attention-based graph neural network for semisupervised learning,2018;Gaan: Gated attention networks for learning on large and spatiotemporal graphs,2018;Rethinking knowledge graph propagation for zero-shot learning,2018-这些基于注意力机制的模型为不同的边分配了权重,但是注意力机制也带来了内存的使用和巨大的计算开销

  • 一篇基于图上的注意力模型的综述文章:Attention models in graphs: A survey,2018


4.2 其他在图上的工作

在图上的方法可分为两类:graph embedding methods和graph laplacian regularization methods。

graph embedding methods

  • DeepWalk:它依赖于截断的随机游走,并使用一种skip-gram来生成节点表示

  • Deep Graph Infomax (DGI),2019:用非监督策略学习图的节点表示,DGI通过最大化相互信息来训练一个图形卷积编码器


5 实验结果

5.1 Citation Networks & Social Networks

640?wx_fmt=png

  • 表2中,可以看出SGC和GCN的性能相当,并且在Citeseer数据集上比GCN高1%。性能提升的原因可能是由于SGC的参数更少较少了过拟合GCN中的过拟合的情况。

  • GIN中就有严重的过拟合。

  • LNet and AdaLNet在引文网络上不稳定。

640?wx_fmt=png

  • 表3是在Reddit社交网络数据集上的实验。

  • SGC比基于GCN的变种GraphSAGE和FastGCN高1%。

  • DGI论文中表示随机初始化的DGI编码器的性能几乎与经过训练的编码器的性能相匹配;然而,这两种模型在Reddit上的表现都不如SGC。这个结果可能表明,额外的权重和非线性激活在DGI编码器中是多余的。


Efficiency
640?wx_fmt=png

  • 图3是在Pubmed和Reddit数据集上的效率对比图

  • 显然,SGC是效率最高的

  • SGC中是预先计算的,SGC训练的时候只需要学习一个权重矩阵Θ,减少了内存的使用。

  • 由于S通常是稀疏的,而K通常比较小,因此,可以用稀疏稠密矩阵乘法进行计算640?wx_fmt=png

  • 无法在Reddit上对GaAN和DGI的训练时间进行基准测试,因为实验没有发布

  • GPU:NVIDIA GTX 1080 Ti

  • 在大图上由于内存要求不能进行GCN的训练。FastGCN和GraphSAGE等方法使用采样的方法减少邻居数量来处理这个问题。Deep Graph InfoMax(ICLR,2019)通过限制模型的size来解决这个问题

  • SGC训练的时候比使用快速采样的FastGCN快两个数量级,并且性能几乎没有损失


5.2 下游任务

使用5个下游任务来研究SGC的适应性:
  • text classification

  • semi-supervised user geolocation

  • relation extraction

  • zero-shot image classification

  • graph classification


Text classification

  • (Graph convolutional networks for text classification,2019)使用2层的GCN来实现了一个state-of-the-art的结果,创建了一个语料库图,该图将文档和单词都视为图中的节点。

  • Word-word边的权值为点信息的互信息(point twise mutual information, PMI), word-document边的权值为标准化的TF-IDF socre。

  • 如表4显示,一个SGC (K = 2)在5个基准数据集上与他们的模型竞争,同时达到了83.6倍的速度。

640?wx_fmt=png

Semi-supervised user geolocation

  • 半监督用户地理定位(Semi-supervised user geolocation)根据用户发布的帖子、用户之间的关系以及少数被标记的用户,来定位用户在社交媒体上的“家”的位置。

  • 表5显示,SGC在GEOTEXT、TWITTERUS和TWITTER-WORLD 的高速公路连接方面优于GCN,同时在TWITTER-WORLD上节省了30多个小时。

640?wx_fmt=png

Relation extraction

  • 关系抽取包括预测句子中主语和宾语之间的关系。

  • C-GCN采用LSTM,后面接着GCN和MLP层。实验将GCN替换为SGC (K = 2)将得到的模型称为C-SGC

640?wx_fmt=png

Zero-shot image classification

  • zero-shot image分类包括学习一个图像分类器,不需要从测试类别中获取任何图像或标签。

  • GCNZ使用GCN将类别名称映射到图像特征域,并查找与查询图像特征向量最相似的类别 - 表7显示,使用MLP替换GCN,然后使用SGC可以提高性能,同时将参数数量减少55%。

  • 为了将预先训练好的GloVe向量映射到由ResNet-50提取的视觉特征空间,需要一个MLP特征提取器。

  • 同样,这个下游应用证明了学习图卷积滤波器是多余的。

640?wx_fmt=png
Graph classification

图分类要求模型使用图结构对图进行分类。

(How powerful are graph neural networks?,ICLR 2019)从理论上证明了GCNs不足以区分特定的图结构,并证明了GIN更具表现力,在各种图分类数据集上获得了 state-of-the-art的结果。

将DCGCN中的GCN替换为SGC,分别获得NCI1和COLLAB数据集上的71.0%和76.2%,这与GCN相当,但远远落后于GIN。

在QM8量子化学数据集上,更高级的AdaLNet和LNet在QM8上得到0.01MAE,远远超过SGC的0.03 MAE。

扫码查看作者更多文章
▼▼▼
640?wx_fmt=jpeg

(*本文为 AI科技大本营转载文章,转载联系作者

公开课推荐




640?wx_fmt=png

推荐阅读

相关文章:

iOS UITableViewCell重用问题

TableView的重用机制,为了做到显示和数据分离,iOS tableView的实现并且不是为每个数据项创建一个tableCell。而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell,对cell做单独的显示配置,来达到既不影响显示效果…

NLP常用工具

为什么80%的码农都做不了架构师?>>> NLP常用工具 各种工具包的有效利用可以使研究者事半功倍。 以下是NLP版版友们提供整理的NLP研究工具包。 同时欢迎大家提供更多更好用的工具包,造福国内的NLP研究。 *NLP Toolbox CLT http://compl…

Swift快速入门之getter 和 setter

属性可以用getter和setter方法的形式提供。 <code class"hljs lasso has-numbering" style"display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: Source Code Pro, monospace;font-size:u…

Linux下getopt函数的使用

getopt为解析命令行参数函数&#xff0c;它是Linux C库函数。使用此函数需要包含系统头文件unistd.h。 getopt函数声明如下&#xff1a; int getopt(int argc, char * const argv[], const char * optstring); 其中函数的argc和argv参数通常直接从main的参数直接传递而来。o…

20行Python代码说清“量子霸权”

作者 | 马超 来源 | 程序人生&#xff08;ID:coder_life&#xff09;近日谷歌的有关量子霸权&#xff08;Quantum Supremacy&#xff09;的论文登上了Nature杂志150年刊的封面位置&#xff0c;而再次罢占各大媒体的头条位置&#xff0c;其实这篇文章之前曾经短暂上过NASA的网站…

Android组件系列----BroadcastReceiver广播接收器

​【声明】 欢迎转载&#xff0c;但请保留文章原始出处→_→ 生命壹号&#xff1a;http://www.cnblogs.com/smyhvae/ 文章来源&#xff1a;http://www.cnblogs.com/smyhvae/p/3960623.html 【正文】 一、广播的功能和特征 广播的生命周期很短&#xff0c;经过调用对象-->…

Swift 代码调试-善用XCode工具(UI调试,五种断点,预览UIImage...)

原创Blog&#xff0c;转载请注明出处 http://blog.csdn.net/hello_hwc?viewmodelist 我的stackoverflow 工欲善其事&#xff0c;必先利其器&#xff0c;强烈建议新手同学好好研究下XCode这个工具。比如Build Settings&#xff0c;Build Info Rules&#xff0c;Build Parse…

Linux下getopt_long函数的使用

getopt_long为解析命令行参数函数&#xff0c;它是Linux C库函数。使用此函数需要包含系统头文件getopt.h。 getopt_long函数声明如下&#xff1a; int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);…

Expect自动化控制简单介绍

telnet&#xff0c;ftp&#xff0c;Passwd&#xff0c;fsck&#xff0c;rlogin&#xff0c;tip&#xff0c;ssh等等。该工具利用Unix伪终端包装其子进程&#xff0c;允许任意程序通过终端接入进行自动化控制&#xff1b;也可利用Tk工具&#xff0c;将交互程序包装在X11的图形用…

C++中标准模板库std::vector的实现

以下实现了C标准模板库std::vector的部分实现&#xff0c;参考了 cplusplus. 关于C中标准模板库std::vector的介绍和用法可以参考 https://blog.csdn.net/fengbingchun/article/details/51510916 实现代码vector.hpp内容如下&#xff1a; #ifndef FBC_STL_VECTOR_HPP_ #defi…

Swift学习 OOP三大特性:继承、多态、封装

先看个例子 从上面的例子可以总结那么一句话:”学生是人”。也就是Student类继承People类。简而言之&#xff0c;学生是人&#xff0c;这句话是说得通的&#xff0c;但是”人是学生”这句话是说不通的&#xff0c;不是学生就不是人了嘛? 从代码中&#xff0c;我们可以看出S…

5折票倒计时3天 | 超干货议程首度曝光!2019 中国大数据技术大会邀您共赴

&#xff08;大会官网https://t.csdnimg.cn/U1wA&#xff09;2019年&#xff0c;大数据与人工智能的热度已经蔓延到了各个领域&#xff0c;智能交通、AIoT、智慧城市&#xff0c;智慧物流、AI中台、工业制造等各种黑科技成为热搜名词。而在今年的乌镇互联网大会上&#xff0c;大…

mysql select * f

mysql> select * from tb;-------------| id | name |-------------| 1 | tbone || 3 | 2d2 || 5 | 55 || 6 | 66 |-------------4 rows in set (0.00 sec)转载于:https://www.cnblogs.com/bashala/p/3974088.html

C++/C++11中用于定义类型别名的两种方法:typedef和using

类型别名(type alias)是一个名字&#xff0c;它是某种类型的同义词。使用类型别名有很多好处&#xff0c;它让复杂的类型名字变得简单明了、易于理解和使用&#xff0c;还有助于程序员清楚地知道使用该类型的真实目的。在C中&#xff0c;任何有效类型都可以有别名。 有两种方法…

iOS学习笔记--01swift实现提示框第三方库:MBProgressHUD

本文使用swift语言使用MBProgressHUD。 开源项目MBProgressHUD可以实现多种形式的提示框。使用简单&#xff0c;方便。GitHud的下载地址是&#xff1a;https://github.com/jdg/MBProgressHUD/ 下载完成后&#xff0c;将MBProgressHUD.h和MBProgressHUD.m拖入已经新建好的Swift项…

2019北京智源大会在京开幕, 中外学术大咖共话人工智能研究前沿

10月31日&#xff0c;由北京智源人工智能研究院主办的2019北京智源大会在国家会议中心开幕&#xff0c;会期两天。智源大会是北京创建全球人工智能学术和创新最优生态的标志性学术活动&#xff0c;定位于“内行的AI盛会”&#xff0c;以国际性、权威性、专业性和前瞻性为特色&a…

linux中登录类型及配置文件

linux中登录shell的类型1.交互式登录&#xff1a;直接通过终端输入用户信息登录1&#xff09;login&#xff1a;2&#xff09;在shell中 su - usernamesu -l username2.非交互式登录1&#xff09;su username2&#xff09;图形界面的终端3&#xff09;执行脚本的过程用户配置文…

Swift项目引入第三方库的方法

分类&#xff1a;iOS&#xff08;55&#xff09; 目录(?)[] Swift项目引入第三方库的方法 转自 http://blog.shiqichan.com/How-To-Import-3rd-Lib-Into-Swift-Project/ 以下&#xff0c;将创建一个Swift项目&#xff0c;然后引入3个库&#xff1a; Snappy 简化autolayout代码…

最新NLP架构的直观解释:多任务学习– ERNIE 2.0(附链接)| CSDN博文精选

作者 | Michael Ye翻译 | 陈雨琳&#xff0c;校对 | 吴金笛来源 | 数据派THU&#xff08;ID&#xff1a;DatapiTHU&#xff09;百度于今年早些时候发布了其最新的NLP架构ERNIE 2.0&#xff0c;在GLUE基准测试中的所有任务上得分均远高于XLNet和BERT。NLP的这一重大突破利用了一…

C++中的内存对齐介绍

网上有很多介绍字节对齐或数据对齐或内存对齐的文章&#xff0c;虽然名字不一样&#xff0c;但是介绍的内容大致都是相同的。这里以内存对齐相称。注&#xff1a;以下内容主要来自网络。 内存对齐&#xff0c;通常也称为数据对齐&#xff0c;是计算机对数据类型合法地址做出了…

__cplusplus的用处

经常在/usr/include目录下看到这种字句&#xff1a; #ifdef __cplusplus extern "C" { #endif ... #ifdef __cplusplus } #endif 不太明白是怎么用的。今天阅读autobook&#xff0c;在第53页看到了作者的解释&#xff1a;C/C编译器对函数和变量名的命名方法不一样…

Linux下的内存对齐函数

在Linux下内存对齐的函数包括posix_memalign, aligned_alloc, memalign, valloc, pvalloc&#xff0c;其各个函数的声明如下&#xff1a; int posix_memalign(void **memptr, size_t alignment, size_t size); void *memalign(size_t alignment, size_t size); void *aligned_…

Swift2.0系列]Error Handling(项目应用篇)

1.FileManager中的应用 倘若你只是想看FileManager中的 Error Handling是如何实现的&#xff0c;请找到3.删除文件以及4.获取文件信息。我分别为你提供了do-catch以及try?的使用方法。 打开Xcode,选中Single View Application&#xff0c;输入项目名称例如FileManagerDemo,点击…

总点第一个视频产生选择偏差?Youtube用“浅塔”来纠正

作者 | Tim Elfrink译者 | Tianyu出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】本文来自于谷歌研究人员最近发表的一篇论文&#xff0c;介绍了视频平台 Youtube 的视频推荐方法&#xff0c;并在 RecSys 2019 大会上做了分享。本文总结归纳了一些论文中的重…

HTML样式offset[Direction] 和 style.[direction]的区别

为什么80%的码农都做不了架构师&#xff1f;>>> 以offsetLeft与style.left为例&#xff1a; offsetLeft使用的值是字符串&#xff0c;如“100px", style.left则使用数值&#xff0c;如 100 offsetLeft只可以读&#xff0c;因此用无法通过Js改变这个值实现样…

Ubuntu 14.04上安装pip3/numpy/matplotlib/scipy操作步骤

Ubuntu 14.04 64位上默认安装了两个版本的python&#xff0c;一个是python2.7.6,另外一个是python3.4.0&#xff0c;如下图所示&#xff1a; 安装完pip3的结果如下图所示&#xff1a; 升级完pip3的结果如下图所示: 安装完numpy的结果如下图所示: 通过sudo pip3 install matplot…

NSHelper.showAlertTitle的两种用法 swift

var model : CarCity CarCity() if (NSString.isNullOrEmpty(locationLabel.text)) { NSHelper.showAlertTitle(nil, message: "暂无法定位&#xff0c;请检查网络。", cancel: "确定") return } if (NSString.isNullOrEmpty(plateTextFild.text)) { NSHe…

通俗易懂:图卷积神经网络入门详解

作者 | 蝈蝈来源 | 转载自知乎用户蝈蝈【导读】GCN问世已经有几年了&#xff08;2016年就诞生了&#xff09;&#xff0c;但是这两年尤为火爆。本人愚钝&#xff0c;一直没能搞懂这个GCN为何物&#xff0c;最开始是看清华写的一篇三四十页的综述&#xff0c;读了几页就没读了&a…

Java数据结构一 —— Java Collections API中的表

1.Collection接口 位于java.util包中&#xff0c;以下是重要的部分。 1 public interface Collection<AnyType> extends Iterable<AnyType> 2 { 3 int size(); 4 boolean isEmpty(); 5 void clear(); 6 boolean add(AnyType x); 7 …

Swift 中的内存管理详解

这篇文章是在阅读《The Swift Programming Language》Automatic Reference Counting&#xff08;ARC&#xff0c;自动引用计数&#xff09;一章时做的一些笔记&#xff0c;同时参考了其他的一些资料。 在早期的 iOS 开发中&#xff0c;内存管理是由开发者手动来完成的。因为传统…