首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >图神经网络之Cora数据集

图神经网络之Cora数据集

作者头像
Tom2Code
发布2023-12-26 11:22:53
发布2023-12-26 11:22:53
3K00
代码可运行
举报
文章被收录于专栏:TomTom
运行总次数:0
代码可运行

今天使用图神经网络和一个很新的库StellarGraph,然后基于TensorFlow搭建了一个分类模型

先来看一下谷歌对cora数据集的介绍:

代码语言:javascript
代码运行次数:0
运行
复制
The Cora dataset consists of 2708 scientific publications classified into one of seven classes. 
The citation network consists of 5429 links. 
Each publication in the dataset is described by a 0/1-valued word vector indicating the absence/presence of the corresponding word from the dictionary.

翻译过来就是:

====

Cora数据集,该数据集由 2708 篇论文,及它们之间的引用关系构成的 5429 条边组成。这些论文被根据主题划分为7类,分别是神经网络、强化学习、规则学习、概率方法、遗传算法、理论研究、案例相关。每篇论文的特征是通过词袋模型得到的,维度为1433,每一维表示一个词,1表示该词在这篇文章中出现过,0表示未出现。

====

今天我们使用一个深度学习库叫做:

代码语言:javascript
代码运行次数:0
运行
复制
StellarGraph

官网:

然后开始今天的代码:

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd
import os

import stellargraph as sg
from stellargraph.mapper import FullBatchNodeGenerator
from stellargraph.layer import GCN

from tensorflow.keras import layers, optimizers, losses, metrics, Model
from sklearn import preprocessing, model_selection
from IPython.display import display, HTML
import matplotlib.pyplot as plt
%matplotlib inline

基本的导入依赖

代码语言:javascript
代码运行次数:0
运行
复制
dataset = sg.datasets.Cora()
display(HTML(dataset.description))
G, node_subjects = dataset.load()

数据集的介绍:

代码语言:javascript
代码运行次数:0
运行
复制
print(G.info())

论文类型:

代码语言:javascript
代码运行次数:0
运行
复制
node_subjects.value_counts().to_frame()

划分数据集:

代码语言:javascript
代码运行次数:0
运行
复制
train_subjects, test_subjects = model_selection.train_test_split(
    node_subjects, train_size=140, test_size=None, stratify=node_subjects
)
val_subjects, test_subjects = model_selection.train_test_split(
    test_subjects, train_size=500, test_size=None, stratify=test_subjects
)

训练集:

代码语言:javascript
代码运行次数:0
运行
复制
train_subjects.value_counts().to_frame()

对类别进行编码:

代码语言:javascript
代码运行次数:0
运行
复制
target_encoding = preprocessing.LabelBinarizer()

train_targets = target_encoding.fit_transform(train_subjects)
val_targets = target_encoding.transform(val_subjects)
test_targets = target_encoding.transform(test_subjects)
# 独热编码
代码语言:javascript
代码运行次数:0
运行
复制
generator = FullBatchNodeGenerator(G, method="gcn")

anyway,这个generator暂时还没搞懂,看上去是个节点生成器之类的

代码语言:javascript
代码运行次数:0
运行
复制
train_gen = generator.flow(train_subjects.index, train_targets)
gcn = GCN(
    layer_sizes=[16, 16], activations=["relu", "relu"], generator=generator, dropout=0.5
)

然后看一下out的shape:

代码语言:javascript
代码运行次数:0
运行
复制
x_inp, x_out = gcn.in_out_tensors()

x_out

然后进行预测:

代码语言:javascript
代码运行次数:0
运行
复制
predictions = layers.Dense(units=train_targets.shape[1], activation="softmax")(x_out)

然后使用tf进行模型的搭建:

代码语言:javascript
代码运行次数:0
运行
复制
model = Model(inputs=x_inp, outputs=predictions)
model.compile(
    optimizer=optimizers.Adam(lr=0.01),
    loss=losses.categorical_crossentropy,
    metrics=["acc"],
)

验证模型&早停:

代码语言:javascript
代码运行次数:0
运行
复制
val_gen = generator.flow(val_subjects.index, val_targets)
代码语言:javascript
代码运行次数:0
运行
复制
from tensorflow.keras.callbacks import EarlyStopping

es_callback = EarlyStopping(monitor="val_acc", patience=50, restore_best_weights=True)

训练:

代码语言:javascript
代码运行次数:0
运行
复制
history = model.fit(
    train_gen,
    epochs=200,
    validation_data=val_gen,
    verbose=2,
    shuffle=False,  # this should be False, since shuffling data means shuffling the whole graph
    callbacks=[es_callback],
)

画图来瞅瞅:

代码语言:javascript
代码运行次数:0
运行
复制
sg.utils.plot_history(history)

验证数据:

代码语言:javascript
代码运行次数:0
运行
复制
test_gen = generator.flow(test_subjects.index, test_targets)
代码语言:javascript
代码运行次数:0
运行
复制
test_metrics = model.evaluate(test_gen)
print("\nTest Set Metrics:")
for name, val in zip(model.metrics_names, test_metrics):
    print("\t{}: {:0.4f}".format(name, val))
代码语言:javascript
代码运行次数:0
运行
复制
all_nodes = node_subjects.index
all_gen = generator.flow(all_nodes)
all_predictions = model.predict(all_gen)
node_predictions = target_encoding.inverse_transform(all_predictions.squeeze())
df = pd.DataFrame({"Predicted": node_predictions, "True": node_subjects})
df.head(20)
代码语言:javascript
代码运行次数:0
运行
复制
embedding_model = Model(inputs=x_inp, outputs=x_out)

嵌入模型的搭建

代码语言:javascript
代码运行次数:0
运行
复制
emb = embedding_model.predict(all_gen)
emb.shape
代码语言:javascript
代码运行次数:0
运行
复制
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE

transform = TSNE  # or PCA 降维
代码语言:javascript
代码运行次数:0
运行
复制
X = emb.squeeze(0)
X.shape
代码语言:javascript
代码运行次数:0
运行
复制
trans = transform(n_components=2)
X_reduced = trans.fit_transform(X)
X_reduced.shape
代码语言:javascript
代码运行次数:0
运行
复制
fig, ax = plt.subplots(figsize=(7, 7))
ax.scatter(
    X_reduced[:, 0],
    X_reduced[:, 1],
    c=node_subjects.astype("category").cat.codes,
    cmap="jet",
    alpha=0.7,
)
ax.set(
    aspect="equal",
    xlabel="$X_1$",
    ylabel="$X_2$",
    title=f"{transform.__name__} visualization of GCN embeddings for cora dataset",
)

画图来check一下我们的图神经网络的分类是否准确:

训练之前的:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tom的小院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档