由于图结构非常复杂且信息量很大,因此对于图的机器学习是一项艰巨的任务。本文介绍了如何使用图卷积网络(GCN)对图进行深度学习,GCN 是一种可直接作用于图并利用其结构信息的强大神经网络。

本文将介绍 GCN,并使用代码示例说明信息是如何通过 GCN 的隐藏层传播的。读者将看到 GCN 如何聚合来自前一层的信息,以及这种机制如何生成图中节点的有用特征表征。

值得注意的是,因为本文所有的矩阵均为np.matrix格式,因此*就等价于np.dot

何为图卷积网络?

GCN 是一类非常强大的用于图数据的神经网络架构。事实上,它非常强大,即使是随机初始化的两层 GCN 也可以生成图网络中节点的有用特征表征。下图展示了这种两层 GCN 生成的每个节点的二维表征。请注意,即使没有经过任何训练,这些二维表征也能够保存图中节点的相对邻近性。

阅读全文 »

之前学Python的时候,感觉Python好简单。最近看图神经网络相关代码,看到了大佬的代码,感觉一万个草泥马在奔腾,原来Python还能这么用。看来之前自己太鼠目寸光了。

你觉得某个技术很简单的时候,那是你对他一无所知。

下面先看一个代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 在python 3 中已经默认就帮你加载了object了
class A(object):
def __init__(self, name):
self.name = name
"""可以理解为当通过子类的super().__init__方法调用父类初始化函数的时候,子类继承并覆盖了父类的属性:
执行父类构造函数,向子类中添加子类中未定义的属性;对于子类和父类均定义的方法和属性,采用的是子类中方法和属性;
所以执行父类中的方法,若子类已经覆盖,则执行子类中的方法。"""
print('self.run:', self.run) # <bound method B.run of dog()>
self.run()

def run(self):
raise NotImplementedError

# 特殊的__len__()方法,可以保证len()函数可以使用
def __len__(self):
return len(self.name)

#该方法可以让类实现迭代功能,可以使用下标或者for...in方法
def __getitem__(self, idx):
return self.name[idx]

class B(A):
def __init__(self, name):
super(B, self).__init__(name) # 初始化父类

def run(self):
print('name:', self.name) # 继承了父类中的属性

# @property将方法变成属性调用,属性的值为函数返回值
@property
def processed_file_names(self):
result = 'data' + '.pt'
return result

# 重写__repr__,当程序员直接打印该对象时,系统将会输出下面自定义的“自我描述”信息
def __repr__(self):
return '{}()'.format(self.name)

# @staticmethod使得类中的方法不需要实例化解就可以调用
@staticmethod
def fun():
return 'fun'

name = 'dog'
MyB = B(name)

print('MyB:', MyB) # 调用B中的__repr__方法
print('len(MyB):', len(MyB)) # 调用A中的__len__()方法
print('MyB[0]:',MyB[0]) # 调用A中的__getitem__方法
print('MyB.processed_file_names:', MyB.processed_file_names) # 方法变成属性

print('B.fun():', B.fun())

输出结果:

1
2
3
4
5
6
7
self.run: <bound method B.run of dog()>
name: dog
MyB: dog()
len(MyB): 3
MyB[0]: d
MyB.processed_file_names: data.pt
B.fun(): fun

这个代码我感觉注释的还可以,不想再过多解释了。遇到问题看代码就行了。

阅读全文 »

在我们读计算机视觉的相关论文时,经常会看到平移不变性这个词,本文将介绍卷积神经网络中的平移不变性是什么,以及为什么具有平移不变性。

什么是平移不变性

不变性

不变性意味着即使目标的外观发生了某种变化,但是你依然可以把它识别出来。这对图像分类来说是一种很好的特性,因为我们希望图像中目标无论是被平移,被旋转,还是被缩放,甚至是不同的光照条件、视角,都可以被成功地识别出来。

所以上面的描述就对应着各种不变性:

阅读全文 »

大概一个月前,老师给我分的方向是图神经网络。研一已经快过完了,我自己还没有确定好自己的研究方向。只知道自己想做技术,但是具体什么技术并没有想法,既然老师给分了这个方向,再加上自身也觉得图神经网络在推荐系统、半监督学习等领域有很大的发展前景,所以扎深这个领域也没什么。个人感觉研究生不像博士,没有那么专一,可以接触的范围广点,关键在于构建起自己的知识体系吧和思考吧。

看图神经网络已经一个星期了,还处于不知道所以云的地步,但是俗话说:“无用之用。”在研究图神经网络路上,本身对傅里叶分析、数字信号处理、卷积操作有了更加深刻的理解。

不说那么多了,边总结(复制)边学习图神经网络吧。下面的主要内容均来自网上,加上自身的一些思考。

CNN中的卷积

了解GCN之前必须对离散卷积(或者说CNN中的卷积)有一个明确的认识:

阅读全文 »

学完线性代数的同学,可能会对线性代数的很多概念有所疑惑.

这个东西有什么用?那个玩意定义出来有什么意义?

本文将探讨线性代数中及其重要的两个概念:特征值与特征向量.

(PS:下文中的矩阵A均认为是方阵)

从一般的角度看,这个映射无非就是矩阵乘向量,说得具体一点,就是$n$次的向量点积计算。(矩阵的一行乘上向量,并对结果向量的所有元素求和,就是一次点积)

阅读全文 »

信号的定义

通常,人们将这些具有某种内容的语言文字、声讯图像以及统计数据等称为消息,如果消息是人们所需要的,那么就称为信息,而信号是携带消息的随时间变化的物理量。

从定义可以看出,图像也看作是信号的一种。那么信号与系统中所述的卷积、傅里叶级数、傅里叶变换和图像中的卷积乃至深度学习中的卷积有何区别和联系呢?本文带着这个问题进行探讨。

卷积

卷积来源

阅读全文 »

谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也不复杂。在处理实际的聚类问题时,个人认为谱聚类是应该首先考虑的几种算法之一。下面我们就对谱聚类的算法原理做一个总结。

谱聚类概述

谱聚类是从图论中演化出来的算法,后来在聚类中得到了广泛的应用。它的主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。

乍一看,这个算法原理的确简单,但是要完全理解这个算法的话,需要对图论中的无向图,线性代数和矩阵分析都有一定的了解。下面我们就从这些需要的基础知识开始,一步步学习谱聚类。

谱聚类基础之一:无向权重图

阅读全文 »

本文从图网络的现有论文中梳理出了目前图网络被应用最多的数据集,主要有三大类,分别是引文网络、社交网络和生物化学图结构,分类参考了论文《A Comprehensive Survey on Graph Neural Networks》。(结尾附数据集下载链接)

引文网络(Cora、PubMed、Citeseer)

引文网络,顾名思义就是由论文和他们的关系构成的网络,这些关系包括例如引用关系、共同的作者等,具有天然的图结构,数据集的任务一般是论文的分类和连接的预测,比较流行的数据集有三个,分别是Cora、PubMed、Citeseer,它们的组成情况如图1所示,Nodes也就是数据集的论文数量,features是每篇论文的特征,数据集中有一个包含多个单词的词汇表,去除了出现频率小于10的词,但是不进行编码,论文的属性是由一串二进制码构成,只用0和1表示该论文有无这个词汇。

文件构成以cora数据集为例,整个语料库中有2708篇论文。在词干堵塞和去除词尾后,只剩下1433个独特的单词。文档频率小于10的所有单词都被删除。数据集包含两个文件,cora.citescora.content

阅读全文 »

归一化方式

为什么要进行数据归一化

在喂给机器学习模型的数据中,对数据要进行归一化的处理。

为什么要进行归一化处理,下面从寻找最优解这个角度给出自己的看法。

假定为预测房价的例子,自变量为面积,房间数两个,因变量为房价。

阅读全文 »