GCN构建tensorflow
时间: 2025-06-30 19:20:47 浏览: 5
### 如何使用 TensorFlow 构建图卷积网络 (GCN)
构建图卷积网络(Graph Convolutional Network, GCN)涉及多个组件的组合,包括图结构表示、邻接矩阵操作以及特征传播机制。下面提供了一个完整的示例来展示如何利用 TensorFlow 实现一个简单的两层 GCN。
#### 导入必要的库
为了简化开发过程并提高效率,在此之前需要安装一些依赖包:
```bash
pip install tensorflow numpy scipy networkx sklearn
```
接着导入所需的 Python 库:
```python
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
from tensorflow.keras import layers
import numpy as np
import scipy.sparse as sp
import networkx as nx
from sklearn.model_selection import train_test_split
```
#### 准备数据集
这里以 Cora 数据集为例说明如何准备输入给 GCN 的数据。Cora 是一个多分类的任务,其中每篇文档被标记为七个类别之一。首先加载原始数据文件,并将其转换成适合于后续处理的形式。
```python
def load_data(path="cora/", dataset="cora"):
"""Load citation network dataset"""
idx_features_labels = np.genfromtxt("{}{}.content".format(path, dataset), dtype=np.dtype(str))
features = sp.csr_matrix(idx_features_labels[:, 1:-1], dtype=np.float32)
labels = encode_onehot(idx_features_labels[:, -1])
# build graph
idx = np.array(idx_features_labels[:, 0], dtype=np.int32)
idx_map = {j: i for i, j in enumerate(idx)}
edges_unordered = np.genfromtxt("{}{}.cites".format(path, dataset),
dtype=np.int32)
edges = np.array(list(map(idx_map.get, edges_unordered.flatten())),
dtype=np.int32).reshape(edges_unordered.shape)
adj = sp.coo_matrix((np.ones(edges.shape[0]), (edges[:, 0], edges[:, 1])),
shape=(labels.shape[0], labels.shape[0]),
dtype=np.float32)
# build symmetric adjacency matrix
adj = adj + adj.T.multiply(adj.T > adj) - adj.multiply(adj.T > adj)
features = normalize(features)
adj = normalize(adj + sp.eye(adj.shape[0]))
idx_train = range(140)
idx_val = range(200, 500)
idx_test = range(500, 1500)
features = torch.FloatTensor(np.array(features.todense()))
labels = torch.LongTensor(np.where(labels)[1])
adj = sparse_mx_to_torch_sparse_tensor(adj)
idx_train = torch.LongTensor(idx_train)
idx_val = torch.LongTensor(idx_val)
idx_test = torch.LongTensor(idx_test)
return adj, features, labels, idx_train, idx_val, idx_test
def normalize(mx):
"""Row-normalize sparse matrix"""
rowsum = np.array(mx.sum(1))
r_inv = np.power(rowsum, -1).flatten()
r_inv[np.isinf(r_inv)] = 0.
r_mat_inv = sp.diags(r_inv)
mx = r_mat_inv.dot(mx)
return mx
def accuracy(output, labels):
preds = output.max(1)[1].type_as(labels)
correct = preds.eq(labels).double()
correct = correct.sum()
return correct / len(labels)
def sparse_mx_to_torch_sparse_tensor(sparse_mx):
"""Convert a scipy sparse matrix to a torch sparse tensor."""
sparse_mx = sparse_mx.tocoo().astype(np.float32)
indices = torch.from_numpy(
np.vstack((sparse_mx.row, sparse_mx.col)).astype(np.int64))
values = torch.from_numpy(sparse_mx.data)
shape = torch.Size(sparse_mx.shape)
return torch.sparse.FloatTensor(indices, values, shape)
```
注意上述代码片段中的部分函数是为了辅助完成整个流程而定义的工具函数[^1]。
#### 定义模型架构
接下来定义两个主要模块——`GraphConvolutionLayer` 和 `GCNModelAE` 来分别代表单个图卷积层及其堆叠版本即完整的编码解码框架。
```python
class GraphConvolution(tf.keras.layers.Layer):
def __init__(self, input_dim, output_dim, dropout=0., act=tf.nn.relu,
**
阅读全文
相关推荐


















