Q&A
- 为什么不直接使用分布Q来监督分布P?原因有两个方面:
(1)之前的方法考虑将聚类分配作为伪标签来以监督的方式重新训练编码器,即深度聚类(deepCluster)。然而,在实验中,我们发现交叉熵损失的梯度变化过于剧烈,无法防止嵌入空间受到干扰。
(2)尽管我们可以用KL散度替代交叉熵损失,但仍然存在一个问题,那就是缺乏聚类信息。我们研究深度聚类的初衷是将聚类目标与深度学习强大的表征能力相结合。因此,我们引入分布P以增强聚类性能的凝聚力,具体细节可以参考DEC。
deepcluster:https://arxiv.org/abs/1807.05520
DEC: - 如何将SDCN用到其他数据集上
(1)基于特征的相似性构建KNN图,具体细节请参考calcu_graph.py。
(2)预训练自编码器并保存预训练模型,具体细节请参考data/pretrain.py。
(3)替换sdcn.py中的参数并运行代码。
关于预训练/KNN图构建/batchsize的一些Issue
- 不管你的数据集是什么格式(图片、文本、图)都需要转化为txt文本格式进行预训练。txt中其实是数组。
- 预训练代码位于 SDCN/data/pretrain.py
- 标签数据并没有被用在构造graph中。在calcu_graph.py中,label只出现在了第12行和40行,第12行是为了统计样本数量,第40行是为了统计构造出的图有多少是inter-edge,有多少是intra-edge。所以其实注释掉也是没问题的。无标签的非graph数据可以注释掉12,40,41行就可以了;无标签的graph数据,因为已经有了graph,就没必要去构造了。
- 因为 GCN 是使用全批处理训练的,所以 SDCN 也是全批处理的。如果你想使用 mini-batch,你可以尝试基于采样的 GNN,例如 GraphSAGE。(有batchsize的话如何处理邻接矩阵)
记录
- calcu_graph.py:关于构图,是基于一个数据集中的所有样本,数据进模型的时候没有batchsize,这一点在issue中有被提到。
其中有个计算错误率的操作,就是在得出的k近邻中,与锚点标签不同的视为错误,计数counter+1。 - pretrain.py:对AE进行预训练的时候是对数据集分batchsize的
- 所有的都看完,关于sdcn.py中的train_sdcn函数设计的训练流程再看看。model得到的predict就是文中图1里GCN得到的Z。