当前位置:   article > 正文

图神经网络_gnn节点嵌入

gnn节点嵌入

目录

图神经网络原理

图神经网络分类

1、图卷积网络(GCN)

2、图注意力网络(GAT)

3、图自编码器(GAE)


神经网络原理

       图神经网络(Graph Neural Networks,GNNs)是一种用于处理图结构数据的机器学习模型。与传统的神经网络模型适用于处理向量或矩阵数据不同,GNNs专门用于建模和学习图数据中的关系和结构。

       GNNs的原理基于节点嵌入(node embedding)和图嵌入(graph embedding)。节点嵌入是指将每个节点映射到低维向量空间,以便模型能够捕捉节点之间的关系。图嵌入则是将整个图映射到一个低维向量表示,用于对整个图进行全局的特征提取。

下面是一个简单的GNN模型的原理和工作流程:

1. 初始化节点嵌入:对每个节点进行初始化,将其表示为向量形式。

2. 信息传递:GNN通过迭代的方式将节点的信息进行传递和聚合。在每个迭代步骤中,每个节点会考虑其自身的特征以及邻居节点的特征,并更新自身的嵌入表示。这样,节点可以逐渐获取和整合周围节点的信息。

3. 聚合邻居信息:在信息传递的过程中,节点会聚合邻居节点的信息。常用的聚合方式包括求和、平均、最大等。聚合后的邻居信息会被结合到节点的嵌入表示中。

4. 更新节点表示:节点通过考虑自身的特征和聚合后的邻居信息,更新自身的嵌入表示。更新可以通过神经网络层、图卷积等方式进行。

5. 重复迭代:上述信息传递和节点更新的过程可以进行多次迭代,直到达到预定义的迭代次数或收敛条件。

6. 图嵌入:最后,可以对整个图进行汇总,得到表示整个图的向量表示。这个向量表示可以用于进行图级别的任务,如图分类、图生成等。

        需要注意的是,不同的GNN模型可能有不同的具体实现细节和变体,如图卷积网络(Graph Convolutional Networks,GCNs)、GraphSAGE、GAT(Graph Attention Networks)等。这些模型在信息传递、节点更新和图嵌入等方面可能有所差异,但整体思想基本类似。通过学习图数据中的节点之间的关系和结构,GNNs能够有效地进行图分析和图学习任务。

神经网络分类

1、图卷积网络(GCN)

图卷积网络(Graph Convolutional Networks,GCNs)有以下优点:

1. 局部和全局信息融合:GCNs通过邻居聚合和节点表示更新的过程,能够有效地融合节点的局部和全局信息。节点的表示可以逐步地通过邻居节点的信息进行传播和更新,从而捕捉图数据中的结构和关系。

2. 参数共享和计算效率:GCNs的参数共享机制使得模型可以在整个图的不同部分共享参数,从而减少参数量和计算复杂度。这使得GCNs能够高效地处理大规模的图数据。

3. 泛化能力:GCNs具有良好的泛化能力,能够处理不同规模、结构和特征的图数据。GCNs的表示学习过程可以逐步融合节点的邻居信息,从而使得节点的表示更具有表征能力。

我们将使用Cora数据集来说明实现GCNs的过程。假设你已经下载了Cora数据集,可以通过以下代码加载和准备数据:

  1. import torch
  2. from torch_geometric.datasets import Planetoid
  3. from torch_geometric.transforms import NormalizeFeatures
  4. # 加载Cora数据集
  5. dataset = Planetoid(root='/path/to/cora', name='Cora', transform=NormalizeFeatures())
  6. # 划分数据集为训练集、验证集和测试集
  7. data = dataset[0]
  8. data.train_mask = data.val_mask = data.test_mask = data.y = None
  9. data = dataset[0]
  10. data.train_mask = torch.zeros(data.num_nodes, dtype=torch.bool)
  11. data.train_mask[:200] = 1
  12. data.val_mask = torch.zeros(data.num_nodes, dtype=torch.bool)
  13. data.val_mask[200:500] = 1
  14. data.test_mask = torch.zeros(data.num_nodes, dtype=torch.bool)
  15. data.test_mask[500:] = 1

接下来,我们可以定义GCN模型。以下是一个简单的两层GCN模型的实现:

  1. import torch.nn as nn
  2. import torch.nn.functional as F
  3. from torch_geometric.nn import GCNConv
  4. class GCN(nn.Module):
  5. def __init__(self, input_dim, hidden_dim, output_dim):
  6. super(GCN, self).__init__()
  7. self.conv1 = GCNConv(input_dim, hidden_dim)
  8. self.conv2 = GCNConv(hidden_dim, output_dim)
  9. def forward(self, x, edge_index):
  10. x = self.conv1(x, edge_index)
  11. x = F.relu(x)
  12. x = F.dropout(x, training=self.training)
  13. x = self.conv2(x, edge_index)
  14. return F.log_softmax(x, dim=1)

然后,我们可以训练和评估模型:

  1. import torch.optim as optim
  2. from torch_geometric.data import DataLoader
  3. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
  4. model = GCN(input_dim=dataset.num_features, hidden_dim=16, output_dim=dataset.num_classes).to(device)
  5. optimizer = optim.Adam(model.parameters(), lr=0.01)
  6. criterion = nn.NLLLoss()
  7. train_loader = DataLoader([data], batch_size=1, shuffle=True)
  8. val_loader = DataLoader([data], batch_size=1, shuffle=False)
  9. test_loader = DataLoader([data], batch_size=1, shuffle=False)
  10. def train():
  11. model.train()
  12. for data in train_loader:
  13. data = data.to(device)
  14. optimizer.zero_grad()
  15. output = model(data.x, data.edge_index)
  16. loss = criterion(output[data.train_mask], data.y[data.train_mask])
  17. loss.backward()
  18. optimizer.step()
  19. def evaluate(loader):
  20. model.eval()
  21. correct = 0
  22. for data in loader:
  23. data = data.to(device)
  24. with torch.no_grad():
  25. output = model(data.x, data.edge_index)
  26. pred = output.argmax(dim=1)
  27. correct += pred.eq(data.y).sum().item()
  28. return correct / len(loader.dataset)
  29. for epoch in range(200):
  30. train()
  31. train_acc = evaluate(train_loader)
  32. val_acc = evaluate(val_loader)
  33. print(f'Epoch: {epoch+1}, Train Acc: {train_acc:.4f}, Val Acc: {val_acc:.4f}')
  34. test_acc = evaluate(test_loader)
  35. print(f'Test Acc: {test_acc:.4f}')

2、图注意力网络(GAT)

图注意力网络(Graph Attention Networks,GAT)是一种图神经网络模型,通过引入注意力机制来对图数据进行建模。相比于传统的图卷积网络(GCN),GAT能够动态地学习节点之间的重要性权重,从而更好地捕捉节点之间的关系。

我们将使用Cora数据集来说明实现GAT的过程。假设你已经下载了Cora数据集,可以通过以下代码加载和准备数据:

  1. import torch
  2. from torch_geometric.datasets import Planetoid
  3. from torch_geometric.transforms import NormalizeFeatures
  4. # 加载Cora数据集
  5. dataset = Planetoid(root='/path/to/cora', name='Cora', transform=NormalizeFeatures())
  6. # 划分数据集为训练集、验证集和测试集
  7. data = dataset[0]
  8. data.train_mask = data.val_mask = data.test_mask = None
  9. data.train_mask[:200] = True
  10. data.val_mask[200:500] = True
  11. data.test_mask[500:] = True

接下来,我们可以定义GAT模型。以下是一个简单的两层GAT模型的实现:

  1. import torch.nn as nn
  2. import torch.nn.functional as F
  3. from torch_geometric.nn import GATConv
  4. class GAT(nn.Module):
  5. def __init__(self, input_dim, hidden_dim, output_dim, num_heads):
  6. super(GAT, self).__init__()
  7. self.conv1 = GATConv(input_dim, hidden_dim, heads=num_heads)
  8. self.conv2 = GATConv(hidden_dim * num_heads, output_dim, concat=False)
  9. def forward(self, x, edge_index):
  10. x = self.conv1(x, edge_index)
  11. x = F.elu(x)
  12. x = self.conv2(x, edge_index)
  13. return F.log_softmax(x, dim=1)

然后,我们可以训练和评估模型:

  1. import torch.optim as optim
  2. from torch_geometric.data import DataLoader
  3. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
  4. model = GAT(input_dim=dataset.num_features, hidden_dim=8, output_dim=dataset.num_classes, num_heads=8).to(device)
  5. optimizer = optim.Adam(model.parameters(), lr=0.005)
  6. criterion = nn.NLLLoss()
  7. train_loader = DataLoader([data], batch_size=1, shuffle=True)
  8. val_loader = DataLoader([data], batch_size=1, shuffle=False)
  9. test_loader = DataLoader([data], batch_size=1, shuffle=False)
  10. def train():
  11. model.train()
  12. for data in train_loader:
  13. data = data.to(device)
  14. optimizer.zero_grad()
  15. output = model(data.x, data.edge_index)
  16. loss = criterion(output[data.train_mask], data.y[data.train_mask])
  17. loss.backward()
  18. optimizer.step()
  19. def evaluate(loader):
  20. model.eval()
  21. correct = 0
  22. for data in loader:
  23. data = data.to(device)
  24. with torch.no_grad():
  25. output = model(data.x, data.edge_index)
  26. pred = output.argmax(dim=1)
  27. correct += pred.eq(data.y).sum().item()
  28. return correct / len(loader.dataset)
  29. for epoch in range(200):
  30. train()
  31. train_acc = evaluate(train_loader)
  32. val_acc = evaluate(val_loader)
  33. print(f'Epoch: {epoch+1}, Train Acc: {train_acc:.4f}, Val Acc: {val_acc:.4f}')
  34. test_acc = evaluate(test_loader)
  35. print(f'Test Acc: {test_acc:.4f}')

3、图自编码器(GAE)

图自编码器(Graph Autoencoder)是一种用于图数据的无监督学习模型,用于学习图结构中的隐藏表示。图自编码器通常由编码器和解码器两部分组成,旨在将图数据压缩到低维空间中,并尽可能地还原原始图数据。

我们将使用Cora数据集来说明实现图自编码器的过程。假设你已经下载了Cora数据集,可以通过以下代码加载和准备数据:

  1. import torch
  2. from torch_geometric.datasets import Planetoid
  3. from torch_geometric.transforms import NormalizeFeatures
  4. # 加载Cora数据集
  5. dataset = Planetoid(root='/path/to/cora', name='Cora', transform=NormalizeFeatures())
  6. # 获取图数据
  7. data = dataset[0]

接下来,我们可以定义图自编码器模型。以下是一个简单的图自编码器模型的实现:

  1. import torch.nn as nn
  2. import torch.nn.functional as F
  3. from torch_geometric.nn import GCNConv
  4. class GraphAutoencoder(nn.Module):
  5. def __init__(self, input_dim, hidden_dim):
  6. super(GraphAutoencoder, self).__init__()
  7. self.encoder = GCNConv(input_dim, hidden_dim)
  8. self.decoder = GCNConv(hidden_dim, input_dim)
  9. def forward(self, x, edge_index):
  10. z = self.encoder(x, edge_index)
  11. x_hat = self.decoder(z, edge_index)
  12. return z, x_hat

然后,我们可以训练模型:

  1. import torch.optim as optim
  2. from torch_geometric.data import DataLoader
  3. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
  4. model = GraphAutoencoder(input_dim=dataset.num_features, hidden_dim=16).to(device)
  5. optimizer = optim.Adam(model.parameters(), lr=0.01)
  6. criterion = nn.MSELoss()
  7. data = data.to(device)
  8. def train():
  9. model.train()
  10. optimizer.zero_grad()
  11. z, x_hat = model(data.x, data.edge_index)
  12. loss = criterion(x_hat, data.x)
  13. loss.backward()
  14. optimizer.step()
  15. def evaluate():
  16. model.eval()
  17. with torch.no_grad():
  18. z, x_hat = model(data.x, data.edge_index)
  19. loss = criterion(x_hat, data.x)
  20. return loss.item()
  21. for epoch in range(200):
  22. train()
  23. loss = evaluate()
  24. print(f'Epoch: {epoch+1}, Loss: {loss:.4f}')

在训练过程中,模型通过将输入图数据压缩为低维表示z,然后再使用解码器将低维表示还原为原始图数据。训练过程中的损失函数为均方差损失,用于衡量重构的图数据与原始图数据之间的差异。

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

闽ICP备14008679号