当前位置:   article > 正文

Python GCN代码实战,图卷积神经网络代码模板,GCN代码框架,直接套用_图卷积python

图卷积python

1.GCN简介

GCN(Graph Convolutional Network)是一种用于图数据的深度学习模型。它是针对图结构数据而设计的神经网络结构,能够学习节点之间的关系和图的全局特性。GCN通过在图数据上进行卷积操作,将节点的特征进行传播和聚合,从而实现节点之间的信息交互和特征学习。

GCN具有很强的适用性,可以用于推荐系统、社交网络分析、生物信息学、化学分子分析等领域。其优点包括对节点之间的关系进行建模、适用于不定长的图数据、处理稀疏图数据等。GCN已经在学术界和工业界取得了一定的成功,并且在图神经网络领域有着广泛的应用前景。

2.代码实战

版本一

这里分别定义了模型的卷积层GraphConvolutionLayer类和模型的主体GCN类,模型的卷积层就是上述公式,计算一层的特征表示,就是利用度矩阵、邻接矩阵以及特征矩阵进行信息传递,H(l)在最开始的时候就是原始的特征矩阵。

这里计算的时候把adj就是度矩阵、单位矩阵、邻接矩阵处理好之后的矩阵,都叫邻接矩阵;

  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. import torch.nn.functional as F
  5. class GraphConvolutionLayer(nn.Module):
  6. def __init__(self, input_dim, output_dim):
  7. super(GraphConvolutionLayer, self).__init__()
  8. self.linear = nn.Linear(input_dim, output_dim)
  9. def forward(self, x, adj_matrix):
  10. x = torch.matmul(adj_matrix, x)
  11. x = self.linear(x)
  12. return F.relu(x)
  13. class GCN(nn.Module):
  14. def __init__(self, input_dim, hidden_dim, output_dim):
  15. super(GCN, self).__init__()
  16. self.gc1 = GraphConvolutionLayer(input_dim, hidden_dim)
  17. self.gc2 = GraphConvolutionLayer(hidden_dim, output_dim)
  18. def forward(self, x, adj_matrix):
  19. x = self.gc1(x, adj_matrix)
  20. x = self.gc2(x, adj_matrix)
  21. return x
  22. # 模拟数据
  23. adj_matrix = torch.tensor([[0, 1, 0], [1, 0, 1], [0, 1, 0]], dtype=torch.float32)
  24. features = torch.tensor([[1, 2], [3, 4], [5, 6]], dtype=torch.float32)
  25. labels = torch.tensor([[0.1], [0.2], [0.3]], dtype=torch.float32)
  26. # 初始化模型
  27. model = GCN(input_dim=2, hidden_dim=16, output_dim=1)
  28. # 定义损失函数和优化器
  29. criterion = nn.MSELoss()
  30. optimizer = optim.Adam(model.parameters(), lr=0.01)
  31. # 训练模型
  32. for epoch in range(100):
  33. optimizer.zero_grad()
  34. output = model(features, adj_matrix)
  35. loss = criterion(output, labels)
  36. loss.backward()
  37. optimizer.step()
  38. if (epoch+1) % 10 == 0:
  39. print(f'Epoch [{epoch+1}/100], Loss: {loss.item()}')

版本二

这里没有单独定义图卷积类,都放到GCN类里了,其实就是邻接矩阵adj和特征矩阵X的组合计算,然后经过一层线性层,再经过激活函数就是这一层的特征表示

  1. import torch
  2. import torch.nn as nn
  3. import torch.nn.functional as F
  4. import torch.optim as optim
  5. class GCN(nn.Module):
  6. def __init__(self, input_dim, hidden_dim, output_dim):
  7. super(GCN, self).__init__()
  8. self.fc1 = nn.Linear(input_dim, hidden_dim)
  9. self.fc2 = nn.Linear(hidden_dim, output_dim)
  10. def forward(self, x, adj):
  11. x = F.relu(self.fc1(torch.mm(adj, x)))
  12. x = self.fc2(torch.mm(adj, x))
  13. return x
  14. # 示例数据和邻接矩阵
  15. x = torch.randn(5, 10) # 特征矩阵,5个节点,每个节点有10个特征
  16. adj = torch.randn(5, 5) # 邻接矩阵
  17. model = GCN(input_dim=10, hidden_dim=16, output_dim=2) # 创建GCN模型
  18. optimizer = optim.Adam(model.parameters(), lr=0.01) # 选择优化器
  19. criterion = nn.CrossEntropyLoss() # 损失函数采用交叉熵
  20. # 训练模型
  21. for epoch in range(100):
  22. optimizer.zero_grad()
  23. output = model(x, adj)
  24. # 假设这里有标签数据y
  25. y = torch.LongTensor([0, 1, 0, 1, 0]) # 5个节点的标签
  26. loss = criterion(output, y)
  27. loss.backward()
  28. optimizer.step()
  29. # 计算训练集和验证集准确率和F1
  30. output = model(x, adj)
  31. predictions = output.argmax(dim=1)
  32. correct = (predictions == y).sum().item()
  33. accuracy = correct / len(y)
  34. precision = torch.true_divide(torch.sum(predictions * y), torch.sum(predictions))
  35. recall = torch.true_divide(torch.sum(predictions * y), torch.sum(y))
  36. f1 = 2 * (precision * recall) / (precision + recall)
  37. print("训练集准确率:", accuracy)
  38. print("训练集F1值:", f1.item())

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/928982
推荐阅读
相关标签
  

闽ICP备14008679号