图神经网络:在KarateClub数据集上动手实现图神经网络

这篇具有很好参考价值的文章主要介绍了图神经网络:在KarateClub数据集上动手实现图神经网络。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章说明:
1)参考资料:PYG的文档。文档超链。
2)博主水平不高,如有错误,还望批评指正。
3)我在百度网盘上传这篇文章的jupyter notebook以及有关文献。提取码8488。

文献阅读:

参考文献:SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS
中文翻译:用图神经网络进行半监督的分类

文献首先:介绍了其他前辈的工作。在损失函数中使用拉普拉斯正则化项。公式如下(打这个公式真费劲,还的学Latex): L = L 0 + λ L r e g \mathcal{L}=\mathcal{L}_{0}+\lambda\mathcal{L}_{reg} L=L0+λLreg with L r e g = ∑ i , j A i , j ∣ ∣ f ( X i ) − f ( X j ) ∣ ∣ 2 = f ( X ) T Δ f ( X ) \mathcal{L}_{reg}=\sum_{i,j}{A}_{i,j}||\mathcal{f}({X}_{i})-\mathcal{f}({X}_{j})||^{2}=\mathcal{f}(X)^{T}\Delta\mathcal{f}(X) Lreg=i,jAi,j∣∣f(Xi)f(Xj)2=f(X)TΔf(X)
符号说明: L \mathcal{L} L表示为损失函数。 L 0 \mathcal{{L}_{0}} L0表示为有标签的损失(还有没标签的毕竟是半监督)。 λ \lambda λ表示为权重系数。 A i , j {A_{i,j}} Ai,j表示为图边。 f ( ⋅ ) \mathcal{f}(\cdot) f()表示为像神经网络的可微函数。 X X X表示为特征矩阵。 Δ = D − A \Delta=D-A Δ=DA表示为非规范化的拉普拉斯算子。 D D D表示为度的矩阵, D i , i = ∑ j A i , j D_{i,i}=\sum_{j}A_{i,j} Di,i=jAi,j
文章然后:简单说明使用上述公式需要有个假设:图中连接节点共享相同标签。于是作者这篇文章便就来了,为了解决这个问题,使用神经网络模型 f ( X , A ) f(X,A) f(X,A)编码图结构,避免使用显示基于图正则化。文章有两贡献,1.提出一种简单良好直接作用于图上的神经网络传播规则并且展示它是如何从谱图卷积的一阶逼近得到反馈。2.演示了基于图神经网络是如何分类的。
文章然后:具体开始阐述理论。 H l + 1 = σ ( D ~ − 1 2 A ~ D ~ − 1 2 H l W l ) H^{l+1}=\sigma(\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}H^{l}W^{l}) Hl+1=σ(D~21A~D~21HlWl)。(知道核心公式就好,其他细节跳过因为我看不懂)
符号说明: D i , i = ∑ j A i , j D_{i,i}=\sum_{j}A_{i,j} Di,i=jAi,j表示为度的矩阵。 A ~ = A + I N \tilde{A}=A+I_{N} A~=A+IN表示为邻接矩阵加上一个单位矩阵。 W l W^{l} Wl表示为权重系数。 σ \sigma σ表示为激活函数。 H l H^{l} Hl为第 l l l层的特征矩阵。 H 0 H^{0} H0即为 X X X
文章然后:进行代码分类实操,他们这里搭建了两层GCN。所以最后的公式为 Z = f ( X , A ) = s o f t m a x ( A ^ R e l u ( A ^ X W 0 ) W 1 ) Z=f(X,A)=softmax(\widehat{A}Relu(\widehat{A}XW^{0})W^{1}) Z=f(X,A)=softmax(A Relu(A XW0)W1)。这里 A ^ = D ~ − 1 2 A ~ D ~ − 1 2 \widehat{A}=\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}} A =D~21A~D~21。损失函数就使用交叉熵 L = − ∑ l ∈ Y l ∑ f = 1 F Y l f ln ⁡ Z l f L=-\sum_{l \in \mathcal{Y}_{l}}\sum_{f=1}^FY_{lf}\ln{Z_{lf}} L=lYlf=1FYlflnZlf吧。
文章然后:介绍图半监督学习领域以及图上运行神经网络领域两个领域相关工作。
文章然后:进行实验展示结果。
文章然后:进行讨论。1.作者模型可以克服Skip-gram方法难以优化多步流程限制同时时间以及效果表现更好。2.未来工作1)解决内存:作者证明对于无法使用GPU大型图,用CPU是可行的。用小批量随机梯度可以缓解这个问题。但是生成小批量时应该考虑GCN的层数,对于非常大且密集连接的图可能需要进一步地近似。2)不支持有向图,但是有解决方法的(具体是什么我没看懂)3)考虑一个权衡参数 λ \lambda λ可能会有益。具体来说就是修改生成自循环图时用的 λ \lambda λ。即 A ~ = A + λ I \tilde{A}=A+\lambda I A~=A+λI
文章然后:得到结论。
文章最后:引用以及其他工作。1)WL-1算法2)深层的GCN。太深不好。

代码实操

导入依赖

import matplotlib.pyplot as plt
import networkx as nx

定义函数

def visualize_graph(G,color):
    plt.figure(figsize=(7,7))
    plt.xticks([])
    plt.yticks([])
    nx.draw_networkx(G,pos=nx.spring_layout(G,seed=42),with_labels=False,node_color=color,cmap="Set2")
    plt.show()
#可视化图网络
def visualize_embedding(h,color,epoch=None,loss=None):
    plt.figure(figsize=(7,7))
    plt.xticks([])
    plt.yticks([])
    h=h.detach().cpu().numpy()
    plt.scatter(h[:,0],h[:,1],s=140,c=color,cmap="Set2")
    if epoch is not None and loss is not None:
        plt.xlabel(f'Epoch: {epoch}, Loss: {loss.item():.4f}',fontsize=16)
    plt.show()
#可视化图嵌入

导入数据

from torch_geometric.datasets import KarateClub
dataset=KarateClub()

KarateClub数据集简单说明:34个人的社交网络,如果在俱乐部之外两人认识连一条边。然后由于俱乐部的内部冲突,人们选择站队所以分成两派。
打印信息

print(len(dataset),dataset.num_features,dataset.num_classes)
#输出:1 34 4

简单说明:num_features:33加上1。33指,这个节点与其他的33个节点是否有边,有边为1,无边为0。1是指度。num_classes:按理应该为2,但是官方做了修改,所以这里为4。

data=dataset[0]
#具体到确定的图上
print(data.num_nodes,data.num_edges,data,data.train_mask.sum().item())
#输出:34 156 Data(x=[34, 34], edge_index=[2, 156], y=[34], train_mask=[34]) 4
print(data.has_isolated_nodes(),data.has_self_loops(),data.is_undirected())
#输出:False False True
edge_index=data.edge_index
print(edge_index.t())
#输出:不表

导入依赖

from torch_geometric.utils import to_networkx

可视网络

G=to_networkx(data,to_undirected=True)
visualize_graph(G,color=data.y)

图神经网络:在KarateClub数据集上动手实现图神经网络
搭建模型GCN的框架

from torch_geometric.nn import GCNConv
from torch.nn import Linear
import torch
class GCN(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1=GCNConv(dataset.num_features,4)
        self.conv2=GCNConv(4,4)
        self.conv3=GCNConv(4,2)
        self.classifier=Linear(2,dataset.num_classes)
    def forward(self,x,edge_index):
        h=self.conv1(x,edge_index)
        h=h.tanh()
        h=self.conv2(h,edge_index)
        h=h.tanh()
        h=self.conv3(h,edge_index)
        h=h.tanh()
        out=self.classifier(h)
        return out,h
model=GCN()
print(model)
#输出
#GCN(
#  (conv1): GCNConv(34, 4)
#  (conv2): GCNConv(4, 4)
#  (conv3): GCNConv(4, 2)
#  (classifier): Linear(in_features=2, out_features=4, bias=True)
#)

简单说明: X v ( l + 1 ) = W ( l + 1 ) ∑ w ∈ N ( v ) ∪ { v } 1 c w , v ⋅ X w ( l ) X_{v}^{(l+1)}=W^{(l+1)}\sum_{w \in N(v)\cup{\{v\}}}\frac{1}{c_{w,v}}\cdot X_{w}^{(l)} Xv(l+1)=W(l+1)wN(v){v}cw,v1Xw(l)
可视嵌入(未经训练)

model=GCN()
_,h=model(data.x,data.edge_index)
visualize_embedding(h,color=data.y)

图神经网络:在KarateClub数据集上动手实现图神经网络
进行训练得出结果

model=GCN()
criterion=torch.nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(model.parameters(),lr=0.01)
def train(data):
    optimizer.zero_grad()
    out,h=model(data.x,data.edge_index)
    loss=criterion(out[data.train_mask],data.y[data.train_mask])
    loss.backward()
    optimizer.step()
    return loss,h
for epoch in range(401):
    loss,h=train(data)
    if epoch==400:
        visualize_embedding(h,color=data.y,epoch=epoch,loss=loss)

图神经网络:在KarateClub数据集上动手实现图神经网络文章来源地址https://www.toymoban.com/news/detail-439022.html

到了这里,关于图神经网络:在KarateClub数据集上动手实现图神经网络的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DHVT:在小数据集上降低VIT与卷积神经网络之间差距,解决从零开始训练的问题

    VIT在归纳偏置方面存在空间相关性和信道表示的多样性两大缺陷。所以论文提出了动态混合视觉变压器(DHVT)来增强这两种感应偏差。 在空间方面,采用混合结构,将卷积集成到补丁嵌入和多层感知器模块中,迫使模型捕获令牌特征及其相邻特征。 在信道方面,引入了MLP中的

    2024年02月08日
    浏览(42)
  • 自己动手实现一个深度学习算法——三、神经网络的学习

    这里所说的“学习”是指从训练数据中自动获取最优权重参数的过程 。为了使神经网络能进行学习,将导入 损失函数 这一指标。而学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。为了找出尽可能小的损失函数的值,利用了 函数斜率的梯度法 。

    2024年02月05日
    浏览(52)
  • 1、动手学深度学习——线性神经网络:线性回归的实现(从零实现+内置函数实现)

    回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域, 回归经常用来表示输入和输出之间的关系 。 给定一个数据集,我们的目标是 寻找模型的权重和偏置 , 使得根据模型做出的预测大体符合数据里的真实价格。 输出的

    2024年02月11日
    浏览(51)
  • 《动手学深度学习》——线性神经网络

    参考资料: 《动手学深度学习》 样本: n n n 表示样本数, x ( i ) = [ x 1 ( i ) , x 2 ( i ) , ⋯   , x d ( i ) ] x^{(i)}=[x^{(i)}_1,x^{(i)}_2,cdots,x^{(i)}_d] x ( i ) = [ x 1 ( i ) ​ , x 2 ( i ) ​ , ⋯ , x d ( i ) ​ ] 表示第 i i i 个样本。 预测: y ^ = w T x + b hat{y}=w^Tx+b y ^ ​ = w T x + b 表示单个样本的预

    2024年02月12日
    浏览(57)
  • 动手学深度学习(二)线性神经网络

    推荐课程:跟李沐学AI的个人空间-跟李沐学AI个人主页-哔哩哔哩视频 目录 一、线性回归 1.1 线性模型 1.2 损失函数(衡量预估质量) 二、基础优化算法(梯度下降算法) 2.1 梯度下降公式 2.2 选择学习率 2.3 小批量随机梯度下降 三、线性回归的从零开始实现(代码实现) 3.1

    2024年02月14日
    浏览(49)
  • 【动手学深度学习】现代卷积神经网络汇总

    本文为作者阅读学习李沐老师《动手学深度学习》一书的阶段性读书总结,原书地址为:Dive into Deep Learning。 网络结构 实现代码 网络特征 最早发布的卷积神经网络之一。 每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均汇聚层。 网络结构 实现代码 网络特

    2024年02月07日
    浏览(50)
  • 李沐《动手学深度学习》线性神经网络 线性回归

    李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 教材:李沐《动手学深度学习》 线性回归基于的 假设 : 假设自变量和因变量之间的关系是线性的,这里通常允许包含观测值的一些噪声; 假设任何噪声都比较正常

    2024年01月21日
    浏览(96)
  • 《Pytorch新手入门》第二节-动手搭建神经网络

    参考《深度学习框架PyTorch:入门与实践_陈云(著)》 代码链接:https://github.com/chenyuntc/pytorch-book 神经网络是机器学习中的一种模型,是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互

    2024年02月05日
    浏览(45)
  • 动手学深度学习—卷积神经网络(原理解释+代码详解)

    多层感知机对图像处理是百万维度,模型不可实现。 如果要在图片中找到某个物体,寻找方法应该和物体位置无关。 适合 计算机视觉 的神经网络架构: 平移不变性 :不管检测对象出现在图像中的哪个位置,神经网络前几层应该对相同图像区域有相似的反应。 局部性 :神

    2024年02月14日
    浏览(55)
  • 动手学深度学习-pytorch版本(二):线性神经网络

    参考引用 动手学深度学习 神经网络的整个训练过程,包括: 定义简单的神经网络架构、数据处理、指定损失函数和如何训练模型 。经典统计学习技术中的 线性回归 和 softmax 回归 可以视为线性神经网络 1.1 线性回归 回归 (regression) 是能为一个或多个自变量与因变量之间关系建

    2024年02月12日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包