本项目提供了一套详细的教程和代码示例,用于指导用户如何从零开始使用Python和深度学习框架(如PyTorch)来构建一个基础的图神经网络模型。适合对图数据处理与分析感兴趣的初学者研究参考。
### GPF(Graph Processing Flow):利用图神经网络处理问题的一般化流程
1. **图节点预表示**:使用NE框架直接获得全图每个节点的Embedding。
2. **正负样本采样**:
- 单个节点作为样本;
- 节点对作为样本;
3. **抽取封闭子图**:可以进行类化处理,建立一种通用图数据结构。
4. **子图特征融合**:包括预表示、节点特征、全局特征和边特征的综合。
5. **网络配置**:
- 可以是输入输出均为图的网络;
- 也可以是图输入分类或聚类结果输出的网络。
6. **训练与测试**
### 主要文件
1. `graph.py`:读入图数据;
2. `embeddings.py`:进行预表示学习;
3. `sample.py`:采样操作;
4. `subgraphs.py/s2vGraph.py`:抽取子图;
5. `batchgraph.py`:融合子图特征;
6. `classifier.py`:配置网络结构;
7. `parameters.py/until.py`: 参数配置和帮助文件。
### 使用方法
1. 在 `parameters.py` 中配置相关参数(可选,默认值即可)。
2. 在example/文件夹中运行相应的案例文件,包括链接预测、节点状态预测等;以下以链接预测为例:
#### 步骤 1:导入配置参数
```python
from parameters import parser, cmd_embed, cmd_opt
```
#### 步骤 2:转换参数设置
```python
args = parser.parse_args()
args.cuda = not args.noCuda and torch.cuda.is_available()
torch.manual_seed(args.seed)
if args.cuda:
torch.cuda.manual_seed(args.seed)
if args.hop != auto:
args.hop = int(args.hop)
if args.maxNodesPerHop is not None:
args.maxNodesPerHop = int(args.maxNodesPerHop)
```
#### 步骤 3:读取数据
```python
g = graph.Graph()
g.read_edgelist(filename=args.dataName, weighted=args.weighted, directed=args.directed)
g.read_node_status(filename=args.labelName)
```
#### 步骤 4:获取全图节点的Embedding
```python
embed_args = cmd_embed.parse_args()
embeddings = embeddings.learn_embeddings(g, embed_args)
node_information = embeddings
print(node_information)
```
#### 步骤 5:正负样本采样
```python
train, train_status, test, test_status = sample.sample_single(g,
args.testRatio,
max_train_num=args.maxTrainNum)
```
#### 步骤 6:抽取节点对的封闭子图
```python
net = until.nxG_to_mat(g)
train_graphs, test_graphs, max_n_label = subgraphs.singleSubgraphs(net,
train,
train_status,
test,
test_status,
args.hop,
args.maxNodesPerHop,
node_information)
print(fTrain: {len(train_graphs)}, Test: {len(test_graphs)})
```
#### 步骤 7:加载网络模型,并配置相关参数
```python
cmd_args = cmd_opt.parse_args()
cmd_args.feat_dim = max_n_label + 1
cmd_args.attr_dim = node_information.shape[1]
cmd_args.latent_dim = [int(x) for x in cmd_args.latent_dim.split(-)]
if len(cmd_args.latent_dim) == 1:
cmd_args.latent_dim = cmd_args.latent_dim[0]
model = classifier.Classifier(cmd_args)
optimizer = optim.Adam(model.parameters(), lr=args.learningRate)
```
#### 步骤 8:训练和测试
```python
train_idxes = list(range(len(train_graphs)))
best_loss = None
for epoch in range(args.num_epochs):
random.shuffle(train_idxes)
model.train()
avg_loss = loop_dataset(train_graphs, model, train_idxes,
cmd_args.batch_size, optimizer=optimizer)
print(f\033[92maverage training of epoch {epoch}: loss {avg_loss[0]:.5f} acc {avg_loss[1]:.5f} auc {avg_loss[2]:.5f}\033[0m)
model.eval()
test_loss = loop_dataset(test_graphs, model,
list(range(len(test_graphs))), cmd_args.batch_size)
print(f\033[93maverage test of epoch {epoch}: loss {test_loss[0]:.5f} acc {test_loss[1]:.5f} auc {test_loss[2]:.5f}\033[0m)
```
#### 步骤