一个开源可扩展的深度图聚类统一代码框架

🚀 一个开源可扩展的深度图聚类统一代码框架

🏠 个人博客:Marigold

🏠 Github主页:Marigoldwu

🔓 代码仓库:A-Unified-Framework-for-Deep-Attribute-Graph-Clustering

近年来,属性图聚类得到迅速发展,各种深度属性图聚类方法不断被提出。虽然大部分方法都是开源的,但遗憾的是这些代码并没有一个统一的框架,这使得研究人员不得不花费大量的时间修改代码来达到复现的目的。幸运的是,Liu等人 [Github主页:yueliu1999]将深度图聚类方法整理成开源代码仓库——Awesome-Deep-Graph-Clustering(ADGC)。他们提供了20多个数据集,并统一了数据集的格式。此外,他们列出了与深度图聚类相关的论文,并提供了源代码链接。值得一提的是,他们将深度图聚类的代码组织成rand-augmentation-model-clustering-visualization-utils结构,极大方便了初学者和研究者。在此,我谨代表我自己,向Liu等人的工作表示衷心的感谢和崇高的敬意。

❤️ 感谢以下作者的提供的开源代码(排名不分先后):

[ yueliu1999 | bdy9527| Liam Liu | Zhihao PENG | William Zhu | WxTu ]

yueliu1999 bdy9527 Liam Liu Zhihao PENG William Zhu WxTu

🍉 概述

我在ADGC的基础上重构了代码,让深度聚类的代码实现了更高的统一。具体来说,我重新设计了代码的架构,让你可以在我的框架中轻松运行不同模型的代码,并且提升了可扩展性。此外,我定义了一些工具类和函数来简化代码并使一些配置更加清晰。

该项目的框架如下:

  • 📃 main.py: 该框架的程序入口文件。
  • 📃 requirements.txt: 需要被安装的第三方库环境。
  • 📁 dataset: 该目录包含你所需要的数据集,其中子目录用数据集名称命名,存放的文件为特征文件、标签文件和邻接矩阵文件,分别命名为 {数据集名}_feat.npy{数据集名}_label.npy{数据集名}_adj.npy, 例如 acm_feat.npyacm_label.npyacm_adj.npy。此外,该目录还包含一个dataset_info.py文件,其中存放了数据集的相关信息。
  • 📁 module: 该目录包含了模型最常用的基础模块, 例如自动编码器(AE.py)、图卷积层(GCN.py)、图注意力层(GAT.py)等。
  • 📁 model: 该目录包含你想要运行的模型。目录格式为:子目录是以模型名称的大写字母命名的,其中包含两个文件,分别是model.py用于存储模型类,train.py用于训练模型。我们的框架会根据输出模型的名称,自动导入模型对应的训练模块。此外,预训练模型也存放在这里,并且目录格式为: pretrain_{模块名}_for_{模型名},该目录是完全小写的,其中存放一个train.py文件。例如,如果你想要预训练SDCN中的AE模块,你可以将其命名为pretrain_ae_for_ sdcn,存放在model中,其中只有一个train.py文件即可。 其中, model.py文件和train.py文件可以根据template目录中提供的模板进行编写,explanation.txt文件提供了argparse所具有的属性,你可以根据自己的需要使用它们。
  • 🛠️ utils: 该目录包括一些工具类和函数。
    • 💾 load_data.py: 它包含加载用于训练的数据集的相关函数。
    • data_processor.py: 它包含数据存储类型转换以及其他变换的函数,例如numpy转torch、对称归一化等。
    • calculator.py: 它包含计算均值和标准差的函数。 该文件已经合并到utils.py中。
    • 📊 evalution.py: 它包含计算聚类指标的函数,例如ACC、NMI、ARI和F1_score。
    • formatter.py: 它包含对输入变量进行格式化输出的函数。 该文件已经合并到utils.py中。
    • 📃 logger.py: 它包含一个用于输出日志信息的日志类。
    • parameter_counter.py: 它包含统计模型参数量的函数。 该文件已经合并到utils.py中。
    • 📁 path_manager.py: 它包含根据需要将相对路径转化为绝对路径的函数。当然,如果不需要转换,也需要调用这个函数,因为该函数可以配置一些文件存储路径,例如日志存储路径、预训练参数文件存储路径、聚类可视化图像存储路径等。
    • 🎨 plot.py: 它包含一个绘制聚类TSNE可视化以及保存图像的函数。稍后也会开发特征热图的图像绘制函数。
    • ⏱️ time_manager.py: 它包含一个用于记录模型耗时的时间类以及一个格式化时间的函数。
    • 🎲 rand.py: 它包含设置随机数种子的函数。
    • 🛠️ utils.py: 它包含来自之前的文件中的工具函数,如来自formatter.py中的get_format_variables()
    • ⚙️ options.py: 它包含argparse对象。用于在命令行输入参数。
    • 💨 kmeans_gpu.py: 它包含经GPU加速的Kmeans算法,来自HSAN。
  • 📁 logs: 该目录用于存储日志输出文件,它的子目录用模型名称命名,日志文件用模型启动时间命名。
  • 📁 pretrain: 该目录用于存储预训练参数文件,它的子目录用pretrain_{模块名}命名,用数据集命名的参数文件存放在以模型名命名的目录下。
  • 🖼️ img: 该目录用于存储输出的图像,其子目录为clustering和heatmap。

🍓 快速上手

在将该项目克隆到本地后,可以根据以下步骤进行运行:

✈️ 步骤1:检查环境或者直接运行requirements.txt安装第三方库。

pip install -r requirements.txt

✈️ 步骤2:准备数据集。如果你没有我们代码所需要的格式的数据集,可以在Liu的仓库中下载。 [yueliu1999 | Google Drive | Nutstore] 。然后将其解压放到dataset目录中。

✈️ 步骤3:在命令行中进入main.py所在目录,并用python运行main.py文件。如果是在集成开发环境中可以直接运行main.py文件。

⭐ 样例

例1

以训练DAEGC为例:

  1. 我们需要先预训练GAT模块:
python main.py --pretrain --model pretrain_gat_for_daegc --dataset acm  --t 2 --desc pretrain_the_GAT_for_DAEGC_on_acm
# or the simplified command:
python main.py -P -M pretrain_gat_for_daegc -D acm -T 2 -DS pretrain_the_GAT_for_DAEGC_on_acm
  1. 然后训练DAEGC:
python main.py --model DAEGC --dataset cora --t 2 --desc Train_DAEGC_1_iteration_on_the_ACM_dataset
# or the simplified command:
python main.py -M DAEGC -D cora -T 2 -DS Train_DAEGC_1_iteration_on_the_ACM_dataset
例2

以训练SDCN为例:

  1. 我们需要先预训练AE模块:
python main.py --pretrain --model pretrain_ae_for_sdcn --dataset acm --desc pretrain_ae_for_SDCN_on_acm
# or simplified command:
python main.py -P -M pretrain_ae_for_sdcn -D acm -DS pretrain_ae_for_SDCN_on_acm
  1. 然后训练SDCN:
python main.py --model SDCN --dataset acm --norm --desc Train_SDCN_1_iteration_on_the_ACM_dataset
# or simplified command:
python main.py -M SDCN -D acm -N  -DS Train_SDCN_1_iteration_on_the_ACM_dataset

✈️ 步骤4:如果你成功运行代码,并且觉得该项目不错,给个⭐️鼓励一下!😉

🔓 目前支持的模型

No.ModelPaperAnalysisSource Code
1DAEGC《Attributed Graph Clustering:
A Deep Attentional Embedding Approach》
论文阅读02link
2SDCN《Structural Deep Clustering Network》论文阅读03link
3AGCN《Attention-driven Graph Clustering Network》论文阅读04link
4EFR-DGC《Deep Graph clustering with enhanced
feature representations for community detection》
论文阅读12link
5GCAE❗️ ​In fact, it’s GAE with GCN.--
6DFCN《Deep Fusion Clustering Network》论文阅读09link
7HSAN《Hard Sample Aware Network for
Contrastive Deep Graph Clustering》
-link

❗️ Attention

  1. 根据论文,DFCN 的训练过程分为三个阶段。 首先,分别预训练 ae 和 igae 30 个 epoch,也就是我们代码中的 pretrain_ae_for_dfcn 和 pretrain_igae_for_dfcn。 其次,同时对 ae 和 igae 进行 100 个 epoch 的预训练,也就是 pretrain_both_for_dfcn 。 最后,正式训练 DFCN 至少 200 个 epoch。
  2. HSAN 不需要预训练。

之后我会陆续更新其他模型代码。如果你很喜欢我的框架并希望让它更强大,可随时提交你的代码。

🤖 运行命令

👽 ​DAEGC
# 预训练
python main.py -P -M pretrain_gat_for_daegc -D acm -T 2 -DS balabala -LS 1
# train
python main.py -M DAEGC -D acm -T 2 -DS balabala -LS 1 -TS -H
👽 ​SDCN
# 预训练
python main.py -P -M pretrain_ae_for_sdcn -D acm -DS balabala -LS 1
# 训练
python main.py -M SDCN -D acm -N -DS balabala -LS 1 -TS -H
👽 ​AGCN
# 预训练
python main.py -P -M pretrain_ae_for_agcn -D acm -DS balabala -LS 1
# 训练
python main.py -M AGCN -D acm -N -DS balabala -LS 1 -TS -H
👽 ​EFR-DGC
# 预训练
python main.py -P -M pretrain_gat_for_efrdgc -D acm -T 2 -DS balabala -LS 1
# 训练
python main.py -M EFRDGC -D acm -T 2 -DS balabala -LS 1 -TS -H
👽 ​GCAE
# 预训练
python main.py -P -M pretrain_gae_for_gcae -D acm -N -DS balabala -LS 1
# 训练
python main.py -M GCAE -D acm -N -DS balabala -LS 1 -TS -H
👽 ​DFCN
# 预训练。依次执行以下命令。
python main.py -P -M pretrain_ae_for_dfcn -D acm -DS balabala -LS 1
python main.py -P -M pretrain_igae_for_dfcn -D acm -N -DS balabala -LS 1
python main.py -P -M pretrain_both_for_dfcn -D acm -N -DS balabala -LS 1
# 训练
python main.py -M DFCN -D acm -N -DS balabala -LS 1 -TS -H
👽 HSAN
# 训练
python main.py -M HSAN -D cora -SLF -A npy -F npy -DS balabala -LS 1 -TS

🍊 进阶

❗️ 可选参数

🥤 帮助文档
> python main.py --help
usage: main.py [-h] [-P] [-TS] [-H] [-N] [-SLF] [-SF] [-DS DESC]
               [-M MODEL_NAME] [-D DATASET_NAME] [-R ROOT] [-K K] [-T T]
               [-LS LOOPS] [-F {tensor,npy}] [-L {tensor,npy}]
               [-A {tensor,npy}]

Scalable Unified Framework of Deep Graph Clustering

optional arguments:
  -h, --help            show this help message and exit
  -P, --pretrain        Whether to pretrain. Using '-P' to pretrain.
  -TS, --tsne           Whether to draw the clustering tsne image. Using '-TS'
                        to draw clustering TSNE.
  -H, --heatmap         Whether to draw the embedding heatmap. Using '-H' to
                        draw embedding heatmap.
  -N, --norm            Whether to normalize the adj, default is False. Using
                        '-N' to load adj with normalization.
  -SLF, --self_loop_false
                        Whether the adj has self-loop, default is True. Using
                        '-SLF' to load adj without self-loop.
  -SF, --symmetric_false
                        Whether the normalization type is symmetric. Using
                        '-SF' to load asymmetric adj.
  -DS DESC, --desc DESC  The description of this experiment.
  -M MODEL_NAME, --model MODEL_NAME
                        The model you want to run.
  -D DATASET_NAME, --dataset DATASET_NAME
                        The dataset you want to use.
  -R ROOT, --root ROOT  Input root path to switch relative path to absolute.
  -K K, --k K           The k of KNN.
  -T T, --t T           The order in GAT. 'None' denotes don't calculate the
                        matrix M.
  -LS LOOPS, --loops LOOPS
                        The Number of training rounds.
  -F {tensor,npy}, --feature {tensor,npy}
                        The datatype of feature. 'tenor' and 'npy' are
                        available.
  -L {tensor,npy}, --label {tensor,npy}
                        The datatype of label. 'tenor' and 'npy' are
                        available.
  -A {tensor,npy}, --adj {tensor,npy}
                        The datatype of adj. 'tenor' and 'npy' are available.
🍹 细节

以下是可修改的argparse参数的细节:

标记参数短选项描述类型/动作默认值
🟥–pretrain-P是否是预训练,如果是请使用’–pretrain‘或’-P’“store_true”False
🟩–tsne-TS如果需要绘制聚类TSNE图像,请使用’–tsne’或’-TS’“store_true”False
🟩–heatmap-H如果需要绘制嵌入热力图,请使用’–heatmap‘或’-H’“store_true”False
🟥–norm-N是否归一化邻接矩阵,默认不归一化。
如果用GAT则不需要归一化,GCN需要。
如果同时用了以上两个,建议先获得没有归一化
的邻接矩阵,
“store_true”False
🟦–self_loop_false-SLF邻接矩阵是否带有自环,默认是有的。
使用’–self_loop_false’或’-SLF’取消自环。
“store_false”True
🟦–symmetric_false-SF归一化采用对称归一化还是非对称,默认对称。
使用’–symmetric_false’或’-SF’取消对称。
“store_false”True
🟥–model-M需要训练的模型,应与模型文件夹中名称对应。str“SDCN”
🟥–dataset-D需要训练的数据集,应与数据集文件夹中名称对应。str“acm”
🟦–k-K用于区别图数据和非图数据,图数据为None,
非图数据应设置KNN的k值。
intNone
🟦–t-TGAT中的M矩阵的t值,默认为None,表示不使用。
如果模型需要用到M,请设置t的值。
intNone
🟥–loops-LS模型训练轮数,默认只训练1轮。int1
🟥–root-R默认使用相对路径,如果需要将相对路径
改为绝对路径, 请将该值设置为根路径,
结尾不包含’/'。
strNone
🟪–desc-DS本次实验的描述。注意描述不应包含空格,
如需空格,请用符号替代空格,如’_‘,’@’
str“default”
🟦–feature-F属性特征加载时的数据类型,
可以是’tensor’或’npy’,默认是’tensor’
str“tensor”
🟦–label-L标签数据加载时的数据类型,
可以是’tensor’或’npy’,默认是’npy’
str“npy”
🟦–adj-A邻接矩阵加载时的数据类型,
可以是’tensor’或’npy’,默认是’tensor’
str“tensor”

💡 提示:

  • 用 🟥 标记参数通常是需要指定的
  • 用 🟩 标记的是绘制图像的功能
  • 用 🟦 标记的通常和数据加载相关
  • 用 🟪 标记的是作者推荐的用于记录实验描述的参数

🧩 可扩展性

强大的可扩展性是该框架的一个突出特点。 如果你想在这个框架中运行你自己的代码,你可以按照以下步骤操作:

🐯 扩展模型

🚄 步骤1: 使用Pytorch重写model.py文件和train.py文件,我们在template目录下提供了模板,然后将这两个文件放在以模型名称大写字母命名的目录下,最后放到model目录下。

🚄 步骤2: 如果你的模型中包含需要预训练的模块,请编写预训练代码,将其放到train.py文件里,然后将train.py文件放到一个以pretrain_{模块名(小写)}_for_{模型名(小写)}的目录下,然后同样放到model目录下 。template中也提供了相应的模板。

此外,在编写代码过程中,如果遇到一些参数是可变的,可参考explanation.txt文件中提供的argparse对象的属性,或者在train.py中直接定义argparse对象的属性并赋初值,而不需要修改options.py文件。

🚄 步骤3: 修改path_manager.py文件第38行中的pretrain_type_dict变量,将你的模型中需要预训练的部分加到其中,具体格式可以参照已经写好的其他模型的预训练部分。注意,要把模型所有需要预训练的部分都写到其中,如果没有,请将列表设置为空而不能删除,因为后面的代码要判断是何种类型的预训练,如果是空的则表示不需要预训练,这一点很重要,否则代码不能正常运行。

🚄 步骤4: 运行你的代码!

🐴 扩展数据集

🚌 步骤1: 确保你的数据集是处理过的,并且是用.npy文件存储的numpy数组。如果扩展的数据集是图数据,则需要三个文件,分别是:{dataset name}_feat.npy、{dataset name}_label.npy、{dataset name}_adj.npy。如果扩展的数据集是非图数据,有两种扩展方法。第一种是将该数据集作为非图数据集,只需要两个文件,分别是:{dataset name}_feat.npy、{dataset name}_label.npy,此外,还需要在load_data.py的第167行中添加构造图的方式,如果该方式不存在,还需要在data_processor.pyconstruct_graph函数中手动添加该方式。另一种扩展方法是,手动进行KNN,然后将图保存为{dataset name}_adj.npy,将其当作图数据加到数据集中。

🚌 步骤2: 将数据文件放入以数据集名称小写字母命名的目录下,然后放到dataset目录下。

🚌 步骤3: 无论是什么数据集,无论是哪种方式,都别忘记在data_info.py文件中添加数据集的信息,否则程序会运行错误。

🚌 步骤4: 使用你的数据集!

🍎 结束语

图深度聚类目前正处于快速发展阶段,在未来会有更多的图聚类方法被提出,因而提供一个统一的代码框架,可以节省研究人员的编码和实验时间,而将更多的精力放在理论创新上,相信未来图聚类会达到更高的水平。

最后,如果该仓库对你有帮助,别忘了Star~😘。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
当谈到Python的热门框架时,以下是一些值得关注的框架: 1. Django:Django是一个高级的Python Web框架,被广泛用于构建复杂的Web应用程序。它提供了强大的数据库访问、表单处理、URL路由等功能,并遵循了MVC(模型-视图-控制器)的设计模式。 2. Flask:Flask是一个轻量级的Python Web框架,适用于构建简单的Web应用程序和API。它具有简单易用的API和灵活的扩展性,可以根据项目需求选择所需的功能。 3. TensorFlow:TensorFlow是一个开源机器学习框架,广泛应用于深度学习和人工智能领域。它提供了丰富的工具和库,用于构建和训练各种类型的神经网络模型。 4. PyTorch:PyTorch是另一个流行的机器学习框架,也用于深度学习和人工智能任务。它提供了动态计算图和易使用的API,使得模型的发和调试更加方便。 5. Scikit-learn:Scikit-learn是一个用于机器学习和数据挖掘的Python库。它提供了各种常用的机器学习算法和工具,包括分类、回归、聚类、特征选择等。 6. Pandas:Pandas是一个用于数据分析和处理的Python库。它提供了高效的数据结构和数据操作功能,使得数据的清洗、转换和分析变得更加简单。 7. NumPy:NumPy是Python科学计算的基础库,提供了高性能的多维数组对象和相关的数学函数。它是许多其他科学计算库的基础。 8. Keras:Keras是一个高级神经网络API,可以运行在TensorFlow、Theano和CNTK等后端上。它提供了简单易用的接口,用于构建和训练各种类型的神经网络模型。 以上只是一些热门的Python框架,还有许多其他优秀的框架可供选择。如果您有特定的需求或项目类型,请告诉我,我可以为您提供更详细的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴不会敲代码吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值