Variational Graph Auto-Encoders VGAE代码模块详细解读(2)

紧接着上一篇发布哦,上一篇的解读如下:
                        
VGAE代码模块详细解读(1)-CSDN博客

 接下来进行预处理preprocess.py模块代码的解读,还是继续粘贴自己做的笔记图片叭:

 接下来进行model.py模块代码的解读:

接下来进行input_data.py模块代码的解读:

我们可以看到Citeseer 数据集得到了额外的处理,而其他数据集则没有类似的处理。其背后的原因是不同的数据集存在特殊问题和结构差异,特别是 Citeseer 数据集的一些特性要求对其进行修复或额外处理。以下是详细解释:

1. Citeseer 数据集中的孤立节点问题

  • 孤立节点(Isolated Nodes):在 Citeseer 数据集中,某些节点没有任何边(即孤立节点),这意味着它们不会在图中与其他节点产生连接。

  • 影响:由于这些节点没有连接,它们在图中没有邻居,这导致它们在原始特征矩阵中并没有相应的特征向量。

  • 修复方法:为了处理这些孤立节点,代码通过创建一个扩展的特征矩阵 tx_extended,确保每个孤立节点都有一个特征向量(即使这个向量是全零向量)。

在代码中,相关的处理逻辑如下:

 if dataset == 'citeseer':
     # 找到测试集中孤立的节点,并在正确的位置添加它们的零向量
     test_idx_range_full = range(min(test_idx_reorder), max(test_idx_reorder) + 1)
     tx_extended = sp.lil_matrix((len(test_idx_range_full), x.shape[1]))
     tx_extended[test_idx_range - min(test_idx_range), :] = tx
     tx = tx_extended

这段代码针对 Citeseer 数据集的特性进行处理:

  • 扩展测试特征矩阵 txtx_extended 通过创建一个比原始 tx 更大的稀疏矩阵,为所有节点(包括孤立节点)提供特征空间,并用原始的 tx 数据填充那些实际有连接的节点的特征。

  • 将孤立节点用零向量表示:孤立节点用全零的特征向量填充。

2. 为什么其他数据集没有类似的处理

  • 没有孤立节点问题:其他数据集(例如 CoraPubmed)不存在 Citeseer 数据集中的孤立节点问题。它们的数据结构较为完整,图中的每个节点都有至少一个连接,并且相应的特征矩阵已经能准确表示每个节点的特征。因此不需要对这些数据集进行类似的处理。

  • 特定的数据集差异:不同的图数据集可能在数据格式、节点特征、边结构等方面有所不同,但 Citeseer 的问题(孤立节点)是一个较为特殊的情况,因而需要专门的修复。

3. 其他数据集的处理方式

  • 对于其他数据集,如 CoraPubmed,没有额外的代码是因为它们的特征矩阵和图结构已经满足训练需求,不需要像 Citeseer 这样处理孤立节点。

  • 它们的特征矩阵通过 sp.vstack((allx, tx)) 直接拼接,测试集的特征按 test_idx_reorder 排序,并且无需对孤立节点进行额外的操作。

我们可以在官网上下载的VGAE_dgl-main代码包里面看到有这四个主要的代码,运行train.py文件可以得出我们实验结果,其他模块相互调用共同完成训练的实现。上面即为代码的相关注释,多多关注里面的损失函数,优化函数,评估以及卷积层等模块,先看论文再看代码哦!

下面是一个使用PyTorch实现的VGAE代码示例: ``` import torch import torch.nn.functional as F from torch_geometric.nn import GCNConv, VGAE from torch_geometric.datasets import Planetoid # 加载Cora数据集 dataset = Planetoid(root='/tmp/Cora', name='Cora') data = dataset[0] # 创建VGAE模型 class VGAEModel(torch.nn.Module): def __init__(self): super(VGAEModel, self).__init__() self.conv1 = GCNConv(dataset.num_features, 16) self.conv2 = GCNConv(16, dataset.num_classes) self.vgae = VGAE(self.conv1, self.conv2) def encode(self, x, edge_index): return self.vgae.encode(x, edge_index) def reparameterize(self, mu, logvar): if self.training: std = torch.exp(0.5 * logvar) eps = torch.randn_like(std) return eps.mul(std).add(mu) else: return mu def decode(self, z, edge_index): return self.vgae.decode(z, edge_index) def forward(self, x, edge_index): z, mu, logvar = self.encode(x, edge_index) z = self.reparameterize(mu, logvar) return self.decode(z, edge_index), mu, logvar model = VGAEModel() # 训练模型 optimizer = torch.optim.Adam(model.parameters(), lr=0.01) def train(): model.train() optimizer.zero_grad() recon, mu, logvar = model(data.x, data.edge_index) loss = F.binary_cross_entropy(recon, data.adjacency_matrix.to_dense()) loss = loss + (1 / data.num_nodes) * (-0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())) loss.backward() optimizer.step() for epoch in range(200): train() print('Epoch:', epoch, 'Loss:', loss.item()) # 在测试集上评估模型 model.eval() z, _, _ = model.encode(data.x, data.edge_index) pred = model.decode(z, data.edge_index) # 可以使用重构误差或其他指标来评估模型的性能 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值