科研训练第十周——关于GCN以及相关代码的学习

ASGCN——基于图卷积神经网络的ABSC任务

关于GCN

如果你也被数学公式劝退的话可以康康这篇讲解
主要的公式如下, A i j A_{ij} Aij是表示图的邻接矩阵
在这里插入图片描述
ASGCN论文中引用的图卷积神经网络模块代码如下:

class GraphConvolution(nn.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=nn.Parameter(torch.FloatTensor(in_features,out_features))#定义需要学习的参数矩阵的形状
        if bias:
            self.bias=nn.Parameter(torch.FloatTensor(out_features))
        else:
            self.register_parameter("bias",None)#没有偏置参数

    def forward(self,text,adj):
        text=torch.tensor(text,dtype=torch.float32).to(self.weight)#就是说text张量的type以及device同weight
        hidden=torch.matmul(text,self.weight)# text*W:可以是高维的
        denom=torch.sum(adj,dim=2,keepdim=True)+1      
        output=torch.matmul(adj,hidden)/denom
        if self.bias is not None:
            return output+self.bias
        else:
            return output

对比一下RGAT论文附带的GCN代码:



class GCN(nn.Module):
    """ 
    GCN module operated on graphs
    """

    def __init__(self, args, in_dim, mem_dim, num_layers):
        super(GCN, self).__init__()
        self.args = args
        self.in_dim = in_dim
        self.num_layers = num_layers
        self.dropout = nn.Dropout(args.gcn_dropout)
        # gcn layer
        self.W = nn.ModuleList()

        for layer in range(num_layers):
            input_dim = self.in_dim if layer == 0 else mem_dim
            self.W.append(nn.Linear(input_dim, mem_dim))

    def conv_l2(self):
        conv_weights = []
        for w in self.W:
            conv_weights += [w.weight, w.bias]
        return sum([x.pow(2).sum() for x in conv_weights])

    def forward(self, adj, feature):
        # gcn layer
        denom = adj.sum(2).unsqueeze(2) + 1
        mask = (adj.sum(2) + adj.sum(1)).eq(0).unsqueeze(2)

        for l in range(self.num_layers):
            Ax = adj.bmm(feature)
            AxW = self.W[l](Ax)
            AxW = AxW + self.W[l](feature)  # self loop
            AxW /= denom

            # gAxW = F.relu(AxW)
            gAxW = AxW
            feature = self.dropout(gAxW) if l < self.num_layers - 1 else gAxW
        return feature, mask

关于代码

这个坑明天和这周之后的时间再填~
总算把实验要用的矩阵算出来了(大概叭,好费时间555,还好教室限网比实验室晚一点😁

关于跑通源码的截图:

在这里插入图片描述

修改树的代码引入ASGCN之后跑出来的结果(Ft-RoBERTa):
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个使用Pytorch Geometric (PyG)库训练图卷积网络(GCN)进行骨骼识别的代码示例: ```python import torch import torch.nn.functional as F from torch_geometric.datasets import Human36M from torch_geometric.nn import GCNConv # 加载数据集 train_dataset = Human36M(root='/path/to/dataset', train=True) test_dataset = Human36M(root='/path/to/dataset', train=False) # 定义图卷积网络模型 class GCN(torch.nn.Module): def __init__(self): super(GCN, self).__init__() self.conv1 = GCNConv(54, 128) # 第一层GCN卷积 self.conv2 = GCNConv(128, 128) # 第二层GCN卷积 self.fc1 = torch.nn.Linear(128, 64) # 全连接层 self.fc2 = torch.nn.Linear(64, 32) # 全连接层 self.fc3 = torch.nn.Linear(32, 17) # 全连接层 def forward(self, x, edge_index): # x: 特征向量 # edge_index: 图的邻接矩阵 x = F.relu(self.conv1(x, edge_index)) # GCN卷积层1 x = F.relu(self.conv2(x, edge_index)) # GCN卷积层2 x = F.relu(self.fc1(x)) # 全连接层1 x = F.relu(self.fc2(x)) # 全连接层2 x = self.fc3(x) # 全连接层3, 输出17维向量 return x # 实例化模型 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = GCN().to(device) # 定义损失函数和优化器 criterion = torch.nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练模型 model.train() for epoch in range(50): train_loss = 0.0 for batch in train_dataset: x, edge_index, y = batch.x.to(device), batch.edge_index.to(device), batch.y.to(device) optimizer.zero_grad() out = model(x, edge_index) loss = criterion(out, y) loss.backward() optimizer.step() train_loss += loss.item() * batch.num_graphs train_loss /= len(train_dataset) print('Epoch: {:03d}, Train Loss: {:.7f}'.format(epoch, train_loss)) # 测试模型 model.eval() test_loss = 0.0 for batch in test_dataset: x, edge_index, y = batch.x.to(device), batch.edge_index.to(device), batch.y.to(device) out = model(x, edge_index) loss = criterion(out, y) test_loss += loss.item() * batch.num_graphs test_loss /= len(test_dataset) print('Test Loss: {:.7f}'.format(test_loss)) ``` 在这个示例中,我们使用了Human3.6M数据集进行骨骼识别。该数据集包含了大量的人体骨骼姿态数据,每个姿态由17个关键点组成。我们使用GCN对每个关键点进行分类,输出17维向量,每一维代表一个关键点的分类得分。我们使用均方误差(MSE)作为损失函数,使用Adam优化器进行优化。在训练过程中,我们使用了50个epoch进行训练,每个epoch中遍历整个训练集。在测试过程中,我们仅仅计算了测试集上的损失,没有进行预测。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值