GCN相关知识点总结

GCN

含义:每一行各元素的和为0,即度 = 其他相邻结点数目,假设度 = 3

直观理解每一行:该处结点的能量流出3点,相邻三个结点各流入1

图拉普拉斯反映了当我们在节点i上施加一个势,这个势以哪个方向能够多顺畅的流向其他节点。

  • 归一化

使得每一行和为1,避免因为某个结点度过大

  • GCN中的卷积

参考链接:何时能懂你的心——图卷积神经网络(GCN)——侧重理解,并非推导

如何理解 Graph Convolutional Network(GCN)?——清华博士的回答,纯数学,目前看不懂

各层特征提取方法如下

$$

H^{(l+1)}=\sigma\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}\right)

$$

  1. $$\tilde{A}=A+I$$意义:邻接矩阵没有考虑自身结点特征,+单位矩阵以考虑自身结点

  1. $$\tilde{D}$$为$$\tilde{A}$$的度矩阵(不是A的)

  • $$\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}}$$用于归一化$$\tilde{A}$$,使得$$\tilde{A}$$每一行的和都为1,这样可以防止某个结点度过多,最后矩阵相乘时,加权求和的值过大,打乱结点数据的分布。

  • 使用$$\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}}$$而不是$$\tilde{D}^{-1} \tilde{A}$$是参考了对称归一化拉普拉斯矩阵,可以让得到的矩阵依然对称

高阶邻近矩阵的计算方法

写在前面

$A^m$的元素意义:如果元素非空就代表,m领域内这些点是可以连通的。也有解释是指:点与点之间走m步能够到达的方案总数。

所以第一代的高阶矩阵直接使用高次幂表示,缺点就是各个位置的权值不同。

MS-G3D就是每一阶只考虑走m步可以刚好达到的位置,所以**具体的实现就是$(A^m>=1)-(A^{m-1}>=1)+I$**,这里和后面的理论结果是一样的。

目前我们使用的邻接矩阵的k次幂来求k阶邻居的计算方式如下:

我们以下面这个例子来进行观察,当我们以节点1分别来求1,2,3阶邻居时,我们会发现相对与k阶邻居来说,距离节点1较近的和度比较大的颜色更深(权重更大),这就是作者说的biased weighting problem。

颜色越深表示权重越大

用pytorch计算了一下该矩阵,如下:

从左到右分别是1阶邻接矩阵,2阶邻接矩阵,3阶邻接矩阵

为了解决biased weighting problem,设置新的邻接矩阵

使用了递推的方式,首先设置好A1和A0

然后使用做差来求高阶的邻接矩阵

I指的是自连接矩阵,后面1那部分表示的意思是:将邻接矩阵k次幂得到的矩阵中元素大于1的元素全都变为1

我们可以观察这种方式求k阶邻居的效果如下:我们可以看到除了k阶邻居和节点本身外,其他节点的权重都为0

下面是使用pytorch用作者提出的公式计算得到结果:

得到下面多尺度的计算公式:

2s-AGCN

改进点

新的注意力机制

st-gcn中是直接按元素乘以注意力掩码$M_k$,这样无法产生不存在的连接,比如手和脚就无法连接。

2s-AGCN是掩膜($B_k,C_k$)直接与邻接矩阵$A_k$相加,就可以产生不存在的连接。

双流——增加新的分支

新分支的输入:骨骼的长度和方向。

首先寻找一个人体骨骼的重心,就是把人胸腔部分作为中心点,因为每个骨骼都有两个点,把靠近中心点的关节看做源关节,远离中心点的关节看做目标关节。所以说关节就是点,骨骼就是从一个点指向另外一个点的向量,向量的长度就是骨骼的长度,向量的方向就是骨骼的方向

细节:

  1. joint和bone两个分支的网络结构一样。由于bone比joint少一个,添加一个0使其与joint数目一致,注意就可以使用同一个网络结构了

  1. 两个网络都得到了评分,直接评分相加,作为最终评分

MS-AGCN

改进点

自适应图卷积

$$

f_{\text {out }}=\sum_{k}^{K_{v}} W_{k} f_{\text {in }}\left(B_{k}+\alpha C_{k}\right)

$$

在$B_k$前添加一个$1-\alpha$:这样

$B_k$初始为$A_k$:这样使用了先验的连接信息,随着训练逐渐会去除这些先验信息,得到合适的自适应邻接矩阵

自适应是指某些参数自适应,比如上面的$\alpha$就是自适应参数

STC注意力模块

SAM:空间注意力机制

TAM:时间注意力机制

CAM:通道注意力机制

都只是用的普通的平均池化,==可以换成CBAM那种==

四流

增加了

前后两帧的关节点位置偏差

前后两帧的骨架向量偏差

MS-G3D

改进点

3D图卷积(同3D卷积)
  1. 将串联二维SGCN和TCN,合成了3D的,进而更合理的捕捉跨时空的信息

  1. 其中时间维度,使用的空洞卷积,在保证参数量不变的情况下,扩大感受野

  1. 同样添加了一个自适应卷积模块,不过是直接和邻接矩阵相加,不像2s-AGCN那么复杂

3D卷积的实现介绍

3D卷积的实现

如原来的NCTV的特征图,由于每次卷积直接使用连续3帧的信息,因此复制前后两帧的特征得到了(NCT,3V)的特征,故相当于有3V个结点,所以A直接复制得到一个(3V,3V)的大矩阵,这样就可以对每一个结点提取到3维空间与其相邻的结点信息。

多尺度实现方法

计算出A的多阶矩阵(1阶矩阵就是与当前结点距离为1的结点),假设需要5阶矩阵,多尺度信息的提取方法就是修改邻接矩阵,将5个5阶矩阵直接拼接为5V×V的大邻接矩阵A_large

A_large与(NCTV)相乘就可以得到NCT,5V的特征,然后view到N,5C,TV,这样特征中就包含了多阶特征的信息。再进行卷积就相当于提取了多尺度特征

参考链接

【骨骼行为识别】2s-AGCN论文理解

(MS-AGCN)阅读Skeleton-Based Action Recognition with Multi-Stream Adaptive Graph Convolutional Networks

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用GCN进行知识图谱实体对齐的Python代码示例: 首先,需要安装相关依赖库,例如networkx、numpy、scikit-learn和pytorch等。 ``` python import networkx as nx import numpy as np from sklearn.preprocessing import LabelEncoder, OneHotEncoder from sklearn.model_selection import train_test_split import torch import torch.nn.functional as F from torch_geometric.data import Data from torch_geometric.nn import GCNConv # 构建两个图G1和G2 G1 = nx.read_edgelist('graph1.txt', delimiter=',', nodetype=int) G2 = nx.read_edgelist('graph2.txt', delimiter=',', nodetype=int) # 创建节点ID到索引的映射 id_to_idx = {} for i, node in enumerate(G1.nodes()): id_to_idx[node] = i for i, node in enumerate(G2.nodes()): id_to_idx[node] = i + len(G1.nodes()) # 创建节点的标签编码器 le = LabelEncoder() labels = list(G1.nodes()) + list(G2.nodes()) le.fit(labels) # 获取节点特征 node_features = np.zeros((len(labels), len(le.classes_))) for i, node in enumerate(labels): node_features[i, le.transform([node])[0]] = 1 # 创建节点特征和关系边缘索引的PyTorch几何数据对象 G1_edges = np.array(list(G1.edges())) G2_edges = np.array(list(G2.edges())) + len(G1.nodes()) edges = np.concatenate((G1_edges, G2_edges), axis=0) data = Data(x=torch.from_numpy(node_features).float(), edge_index=torch.from_numpy(edges).T) # 划分训练和测试数据集 train_idx, test_idx = train_test_split(np.arange(len(labels)), test_size=0.2, random_state=42) # 创建GCN模型 class GCN(torch.nn.Module): def __init__(self, in_channels, hidden_channels, out_channels): super(GCN, self).__init__() self.conv1 = GCNConv(in_channels, hidden_channels) self.conv2 = GCNConv(hidden_channels, out_channels) def forward(self, x, edge_index): x = self.conv1(x, edge_index) x = F.relu(x) x = F.dropout(x, training=self.training) x = self.conv2(x, edge_index) return x # 训练GCN模型 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = GCN(node_features.shape[1], 16, 2).to(device) optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4) criterion = torch.nn.CrossEntropyLoss() data = data.to(device) train_idx = torch.from_numpy(train_idx).to(device) test_idx = torch.from_numpy(test_idx).to(device) def train(): model.train() optimizer.zero_grad() out = model(data.x, data.edge_index)[train_idx] loss = criterion(out, torch.cat((torch.zeros(len(G1.nodes())), torch.ones(len(G2.nodes())))).long().to(device)) loss.backward() optimizer.step() return loss.item() def test(): model.eval() out = model(data.x, data.edge_index)[test_idx] pred = out.argmax(dim=1) acc = int((pred == torch.cat((torch.zeros(len(G1.nodes())), torch.ones(len(G2.nodes())))).long().to(device)).sum()) / len(test_idx) return acc for epoch in range(1, 201): loss = train() acc = test() print(f'Epoch {epoch:03d}, Loss: {loss:.4f}, Acc: {acc:.4f}') # 对齐实体 model.eval() out = model(data.x, data.edge_index) pred = out.argmax(dim=1) for i, node in enumerate(labels): if pred[i] == 0: G1.nodes[node]['label'] = le.inverse_transform([node_features[i].argmax()])[0] else: G2.nodes[node]['label'] = le.inverse_transform([node_features[i].argmax()])[0] ``` 在这个示例中,首先读入两个图G1和G2的边缘列表文件,并将它们转换为networkx图对象。然后,使用LabelEncoder将节点标签转换为数字,并将节点特征和边缘索引转换为PyTorch几何数据对象。接着,将数据集划分为训练集和测试集,并创建一个GCN模型。最后,使用训练集训练模型,并使用测试集评估模型的性能。在训练完成之后,可以使用模型预测每个节点所属的图,并将相应的节点标签添加到每个图中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐先生的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值