入门一个方向不仅要看论文(似懂非懂),还要搞清楚论文的代码才行
那就开始吧,逐句理解👨
GPU
首先设定可见的 GPU (我也想拥有…)
os.environ["CUDA_VISIBLE_DEVICES"] = "1,2,3"
然后慢慢给显存,但不会释放,所以会有碎片
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
设置数据集 acm,featype 为下面的特征矩阵类型 现在是 fea,输出一段确认信息数据集和 featype
训练参数
batch_size 为 1
nb_epoches 为 200(共 200 轮吗?)
patience 不知道
lr 学习率 0.005
l2_coef 权重衰减 0.001
每层每个注意头的隐藏单元数目
hid_units = [8] 8 个隐藏单元
n_heads = [8, 1] 输出层的附加东西,8个到1个吗?
residual = False 是不设置残差吗?
nonlinearity = tf.nn.elu 非线性函数为 elu
model = HeteGAT_multi 模型为 heteGAT_multi (这个具体在 gat.py 文件里)
接着输出一系列确认信息
数据集、学习率、权重衰减
层数(这个输出是隐藏单元数?)、隐藏单元数、注意头数(n_heads ?)
残差、非线性函数、模型
sample_mask
创建一个 mask,下面 load_data 用得到
生成一个全是 false 的列表
对应 idx 位置设为 true
load_data
下面以 ACM3025 为例
用 scipy.io 的 sio 导入 mat 数据
导入后,可以看到 ‘PTP’、‘PLP’、'PAP‘、‘feature’、‘label’、‘train_idx’、'val_idx’ 、‘test_idx’ 索引
获取 label 和 feature,维度分别为 (3025, 3) 和 (3025, 1870)
样本个数 N,N 为 3025
data[‘PAP’] 和 data[‘PLP’] 都是 (3025, 3025)
rownetworks 是这两个矩阵减去单位矩阵,然后拼接
rownetworks = [data['PAP'] - np.eye(N), data['PLP'] - np.eye(N)]
记 label 为 y
train_idx、val_idx、test_idx 分别记录训练集、验证和测试的下标
维度各自为 (1, 600)、(1, 300)、(1, 2125)
测试集这么多?
然后用到上面的 mask
生成 train_mask、val_mask、test_mask
总长度是 3025,这些数据集对应的下标为 true
生成三个集对应的 y
先生成 3 个全空的 y 尺寸的矩阵(3025, 3)
然后把 y 上对应下标的值给到对应的三个集上,注意不是切片
这样 y_train 等三个集都还是 (3025, 3),对应下标都是 y 的值了,其他位置还是 0
输出一条确认信息,y_train 等和 train_idx 等的 shape
把特征复制 3 遍拼在一起 得到 truefeatures_list
最后,函数返回 rownetworks, truefeatures_list, y_train等,train_mask等
然后下面用 adj_list 接 rownetworks,fea_list 接 truefeatures_list
这里来了一句:试一试
如果 featype == ‘adj’,把 adj_list 当作fea_list
【所以 fea=fea,没有用到元路径信息?】