【AM-GCN】代码解读之model结构(四)

前篇:
【AM-GCN】代码解读之初了解(一)
【AM-GCN】代码解读之主程序(二)
【AM-GCN】代码解读之utlis(三)
【AM-GCN】论文解读


该篇讲解具有前后联系的:layers.pymodels.py

壹、文件 layers.py

一、导入库

import math
import torch
from torch.nn.parameter import Parameter
from torch.nn.modules.module import Module

二、GCN卷积层

class GraphConvolution(Module):
    def __init__(self, in_features, out_features, bias=True):
        super(GraphConvolution, self).__init__()
        self.in_features = in_features
        self.out_features = out_features
        self.weight = Parameter(torch.FloatTensor(in_features, out_features))
        if bias:
            self.bias = Parameter(torch.FloatTensor(out_features))
        else:
            self.register_parameter('bias', None)
        self.reset_parameters()

    def reset_parameters(self):
        stdv = 1. / math.sqrt(self.weight.size(1))
        self.weight.data.uniform_(-stdv, stdv)
        if self.bias is not None:
            self.bias.data.uniform_(-stdv, stdv)

    def forward(self, input, adj):
        support = torch.mm(input, self.weight)
        output = torch.spmm(adj, support)
        if self.bias is not None:
            return output + self.bias
        else:
            return output

    def __repr__(self):
        return self.__class__.__name__ + ' (' \
               + str(self.in_features) + ' -> ' \
               + str(self.out_features) + ')'

这是所有图卷积层的基础框架,大同小异。
如果不明白的话,可以查看链接 《torch搭建GCN的详细介绍》
根据我个人的修改经验,在自己搭建框架的时候只需要注意两点:

  1. reset_parameters()中初始化的方法(不了解可查看超链接):
    • self.weight.data.uniform_(-stdv, stdv)[原文]
    • init.kaiming_uniform_(self.weight)[具体见下]
    def reset_parameters(self):
        """
        数据初始化的方法
        """
        init.kaiming_uniform_(self.weight)
        if self.use_bias:
            init.zeros_(self.bias)
  1. 矩阵的乘法(非点乘,可点开查看超链接)。有的A是稀疏的,有的不是,有的是二维乘法有的是多维乘法。根据不同情况,选择合适的函数。

贰、文件models.py

一、导入库

import torch.nn as nn #torch中定义好的神经网络层
import torch.nn.functional as F #torch中自带的一些函数
import torch

from layers import GraphConvolution #导入从前面定义好的GCN层

二、搭建GCN模块

class GCN(nn.Module):
    def __init__(self, nfeat, nhid, out, dropout):
        super(GCN, self).__init__()
        self.gc1 = GraphConvolution(nfeat, nhid)
        self.gc2 = GraphConvolution(nhid, out)
        self.dropout = dropout

    def forward(self, x, adj):
        x = F.relu(self.gc1(x, adj))
        x = F.dropout(x, self.dropout, training = self.training)
        x = self.gc2(x, adj)
        return x

1.区别:对GCNlayer和GCNmodule不理解的看过来!

GCNlayer—对应—单层神经网络
GCNmodule—对应—多层神经网络
在这里插入图片描述

  1. F.dropout()函数,不理解的可以查看对用链接

原理讲解
易错点

三、注意力机制

class Attention(nn.Module):
    def __init__(self, in_size, hidden_size=16):
        super(Attention, self).__init__()

        self.project = nn.Sequential(
            nn.Linear(in_size, hidden_size),
            nn.Tanh(),
            nn.Linear(hidden_size, 1, bias=False)
        )

    def forward(self, z):
        w = self.project(z)
        beta = torch.softmax(w, dim=1)
        return (beta * z).sum(1), beta

函数解释

  1. nn.Sequential(),是一个Model搭建的容器,按照添加的顺序运行。如上代码中,添加的顺序为:nn.Linear, nn.Tanh, nn.Linear
    假设没有nn.Sequential这个容器。可以等价于如下。当Model中的神经层很多的时候比较麻烦。而nn.Sequential就可以更方便的书写了。
def __init__(self, in_size, hidden_size=16):
	self.l1 = nn.Linear(in_size, hidden_size)
	self.l2 =nn.Linear(hidden_size, 1, bias=False)
def forward(self, z):
	h1 = self.l1(z)
	h2 = nn.Tanh(h1)
	w = self.l2(h2)
	

可参考:torch.nn.Sequential()讲解,或者,torch.nn.Sequential()搭建神经网络

  1. torch.softmax()

sogtmax公式解析
函数解析
代码演示
用途:用于多分类任务进行分类的。
特点:非线性性,和为1.

  1. 作用:【见论文解读】文章中有三个嵌入:feature graph 的嵌入,topology graph 的嵌入以及 common 嵌入。对于这三个嵌入进行“资源分配”的。具体可以查看《注意力机制》

四、AM-GCN结构

class SFGCN(nn.Module):
    def __init__(self, nfeat, nclass, nhid1, nhid2, n, dropout):
        super(SFGCN, self).__init__()
        # nfeat特征,nhid1隐藏层1,nhid2隐藏层2,dropout丢弃率
        self.SGCN1 = GCN(nfeat, nhid1, nhid2, dropout) #gcnmodule
        self.SGCN2 = GCN(nfeat, nhid1, nhid2, dropout) #gcnmodule
        self.CGCN = GCN(nfeat, nhid1, nhid2, dropout)  #gcnmodule

        self.dropout = dropout
        self.a = nn.Parameter(torch.zeros(size=(nhid2, 1)))
        nn.init.xavier_uniform_(self.a.data, gain=1.414) # 初始化参数
        self.attention = Attention(nhid2) # 注意力机制
        self.tanh = nn.Tanh()

        self.MLP = nn.Sequential(
            nn.Linear(nhid2, nclass),
            nn.LogSoftmax(dim=1)
        )  # MLP(多层感知机)=神经网络

    def forward(self, x, sadj, fadj):
        emb1 = self.SGCN1(x, sadj) # Special_GCN out1 -- sadj structure graph
        com1 = self.CGCN(x, sadj)  # Common_GCN out1 -- sadj structure graph
        com2 = self.CGCN(x, fadj)  # Common_GCN out2 -- fadj feature graph
        emb2 = self.SGCN2(x, fadj) # Special_GCN out2 -- fadj feature graph
        Xcom = (com1 + com2) / 2
        ##attention
        emb = torch.stack([emb1, emb2, Xcom], dim=1)
        emb, att = self.attention(emb)
        output = self.MLP(emb)
        return output, att, emb1, com1, com2, emb2, emb

代码解析

  1. nn.Lineae():torch中全链接网络
  2. nn.LogSoftmax():torch中的函数,先求softmax函数,再求log函数。
  3. torch.stack:向量拼接

数据流转
在这里插入图片描述

T-GCN(Temporal Graph Convolutional Network)是一种用于时间序列分类和预测的深度学习模型。它的核心思想是将时间序列数据表示成一个图结构,然后利用图卷积神经网络(GCN)对图进行卷积操作,从而实现时间序列数据的特征提取和预测。 以下是 T-GCN 模型的代码解读: ```python class TGCN(nn.Module): def __init__(self, num_nodes, in_channels, out_channels, K, p): super(TGCN, self).__init__() self.K = K self.p = p self.num_nodes = num_nodes self.conv1 = nn.ModuleList() self.conv2 = nn.ModuleList() self.conv3 = nn.ModuleList() self.conv4 = nn.ModuleList() self.conv5 = nn.ModuleList() self.conv6 = nn.ModuleList() for i in range(K): self.conv1.append(GCNConv(in_channels, 64)) self.conv2.append(GCNConv(64, 64)) self.conv3.append(GCNConv(64, 64)) self.conv4.append(GCNConv(64, 128)) self.conv5.append(GCNConv(128, 128)) self.conv6.append(GCNConv(128, out_channels)) def forward(self, x, A): x = x.reshape(self.num_nodes, self.p, -1) for i in range(self.K): x1 = self.conv1[i](x.view(self.num_nodes, -1), A) x1 = F.relu(x1) x2 = self.conv2[i](x1, A) x2 = F.relu(x2) x3 = self.conv3[i](x2, A) x3 = F.relu(x3) x4 = self.conv4[i](x3, A) x4 = F.relu(x4) x5 = self.conv5[i](x4, A) x5 = F.relu(x5) x6 = self.conv6[i](x5, A) if i == 0: res = x6 else: res += x6 x = torch.cat([x[:, 1:, :], x6.unsqueeze(1)], dim=1) return res ``` 这个模型的输入是一个形状为 `(num_nodes, p, in_channels)` 的张量 `x`,表示有 `num_nodes` 个节点、每个节点 `p` 个时间步、每个时间步 `in_channels` 个特征。`A` 是形状为 `(num_nodes, num_nodes)` 的邻接矩阵,表示节点之间的联系。 首先,模型将 `x` reshape 成 `(num_nodes, p, -1)` 的形状,其中 `-1` 表示特征维度。接着,模型利用 `nn.ModuleList` 定义了 6 层 GCN,每层 GCN 都包含了若干个 `GCNConv` 层。在每层 GCN 中,模型将输入 `x` 进行卷积,并利用 ReLU 激活函数进行非线性转换。最后一层 GCN 的输出作为该层的输出 `x6`。 在每个时刻 `i`,模型将 `x6` 加到之前的结果 `res` 中,并将 `x` 中除了第一个时间步以外的所有时间步和 `x6` 的第一个时间步拼接在一起,得到新的 `x`。这个过程会重复执行 `K` 次,最终模型的输出就是 `res`。 总体来说,T-GCN 模型是一个基于 GCN 的循环神经网络,可以对时间序列数据进行建模和预测。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值