IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【机器学习】图卷积网络GCN的原理及Pytorch实现 -> 正文阅读

[人工智能]【机器学习】图卷积网络GCN的原理及Pytorch实现

一、背景知识

1.1 GCN的作用

欧几里得结构:CNN处理的数据是矩阵形式,就是以像素点排列成的矩阵为基础。称为Euclidean Structure,欧几里得结构。

拓扑结构(图结构):GCN处理的数据是图结构,即Non Euclidean Structure非欧几里得结构,拓扑结构。如社交网络连接,信息网络等等。对于Non euclidean structure的数据,卷积神经网络就没有用了。

对于卷积神经网络CNN,图片中提取特征,可以采用卷积的方式提取特征。但是对于拓扑结构,只能用其他方法来提取特征。因此使用GCN来提取拓扑结构图中的特征。

1.2 傅立叶变换

傅立叶变换:将一个域的信号转换到另一个域,便于我们分析与运算。

傅立叶变换的性质:原域进行卷积,相当于频域进行相乘,即:
f ? g = F ? 1 { F { f } ? F { g } } f * g=\mathcal{F}^{-1}\{\mathcal{F}\{f\} \cdot \mathcal{F}\{g\}\} f?g=F?1{F{f}?F{g}}
即一个域相乘,相当于另一个域卷积;一个域卷积,相当于另一个域相乘。

算图域卷积相当于傅立叶域相乘,那先对图和卷积核做傅立叶变换后相乘,再傅立叶反变换回来,就得到了图域卷积。

1.3 图的拉普拉斯矩阵

图的拉普拉斯矩阵定义为:L = D - A请添加图片描述
L为拉普拉斯矩阵Laplacian matrix;
D为对角度矩阵Degree matrix,对角线上的元素是顶点的度,即该元素链接的元素的个数;
A为邻接矩阵 Adjacency matrix ,即表示任意两个顶点之间的邻接关系,邻接则为1,不邻接则为0。

1.4 傅立叶变换与拉普拉斯矩阵的关系

传统傅立叶变换的基,就是拉普拉斯矩阵的一组特征向量。
L = U Λ U T = U ( λ 1 ? λ n ) U ? 1 L=U \Lambda U^{T}=U\left(\begin{array}{ccc} \lambda_{1} & & \\ & \ddots & \\ & & \lambda_{n} \end{array}\right) U^{-1} L=UΛUT=U???λ1????λn?????U?1
U就是L的特征向量,也是傅立叶变换的基。 U = ( u 1 → , u 2 → , ? ? , u n → ) U=\left(\overrightarrow{u_{1}}, \overrightarrow{u_{2}}, \cdots, \overrightarrow{u_{n}}\right) U=(u1? ?,u2? ?,?,un? ?),也是正交矩阵 U U T = E U U^{T}=E UUT=E

Λ \Lambda Λ是L的特征值组成的对角矩阵

问题的转换:傅立叶变换的基 -> 拉普拉斯矩阵的特征向量 -> 拉普拉斯矩阵的特征分解

图的傅里叶变换的矩阵形式:
G F { x } = U T x \mathcal{G} \mathcal{F}\{x\}=U^{T} x GF{x}=UTx

反傅立叶变换的矩阵形式:
I G F { x } = U x \mathcal{I} \mathcal{G} \mathcal{F}\{x\}=U x IGF{x}=Ux

二、图卷积网络

将傅里叶变换应用于图的卷积,有如下公式:
f ? g = F ? 1 { F { f } ? F { g } } f * g=\mathcal{F}^{-1}\{\mathcal{F}\{f\} \cdot \mathcal{F}\{g\}\} f?g=F?1{F{f}?F{g}}
即一域卷积,相当于另一域相乘。其中的逻辑关系等价:图域卷积——频域相乘。中间的桥梁就是傅立叶变换与反傅立叶变换。

结合上面的结论,我们可以得出:
g ? x = U ( U T g ? U T x ) g * x=U\left(U^{T} g \cdot U^{T} x\right) g?x=U(UTg?UTx)
g就是 filter函数,也就是卷积核.

经历一系列简化后的公式如下:
g θ ′ ? x = θ ( D ~ ? 1 2 A ~ D ~ ? 1 2 ) x g_{\theta^{\prime}} * x=\theta\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}}\right) x gθ??x=θ(D~?21?A~D~?21?)x
再加上激活层:
H ( l + 1 ) = σ ( D ~ ? 1 2 A ~ D ~ ? 1 2 H ( l ) W ( l ) ) H^{(l+1)}=\sigma\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}\right) H(l+1)=σ(D~?21?A~D~?21?H(l)W(l))
H ( l + 1 ) H^{(l+1)} H(l+1)是每一层的输出,D是度矩阵,A是邻接矩阵, H ( l ) H^{(l)} H(l)是每一层的输入, W ( l ) W^{(l)} W(l)是每一层的可学习参数。

三、GCN的Pytorch实现

def normalize(A , symmetric=True):
    A = A+torch.eye(A.size(0))
    d = A.sum(1)
    if symmetric:
        D = torch.diag(torch.pow(d, -0.5))
        return D.mm(A).mm(D)
        # D^(-1/2)AD^(-1/2)
    else:
        D = torch.diag(torch.pow(d, -1))
        return D.mm(A)


class GCN(nn.Module):
	'''
	Z = AXW
	'''
	def __init__(self, options, A, dim_in, dim_out):
		super().__init__()
        self.options = options
		self.A = A
		self.fc1 = nn.Linear(dim_in, dim_in, bias=False)
		self.fc2 = nn.Linear(dim_in, dim_in//2, bias=False)
		self.fc3 = nn.Linear(dim_in//2, dim_out, bias=False)

	def forward(self,X):
		'''
		计算三层gcn
		'''
		X = F.relu(self.fc1(self.A.mm(X)))
		# X就是公式中的H
		X = F.relu(self.fc2(self.A.mm(X)))
		return self.fc3(self.A.mm(X))

# 初始化图和添加边
G=nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,4)

# 得到邻接矩阵
A = nx.adjacency_matrix(G).todense()

A_normed = normalize(torch.FloatTensor(A),True)

N = len(A)
X_dim = N

...

gcn = GCN(self.options, A_normed, X_dim, self.options['d_model']).to(self.options['device'])

参考资料

  1. 从Graph Convolutional Networks for Text Classification看图卷积网络
  2. GCN (Graph Convolutional Network) 图卷积网络解析
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:08:21  更:2022-03-17 22:10:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:38:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码