y_train: 保留0-140,其余部份设置为0;
y_val: 保留141-639,其余部份设置为0;
y_test: 保留1708-2707,其余部份设置为0;
def sparse_to_tuple方法,mx.row, mx.col表示非0 元素 在稀疏矩阵中的坐标,非0元素通过以下三个变量进行描述:coords,values和shape,sparse_mx(coords, values, shape)为tuple。
直接定位到sparse_mx = to_tuple(sparse_mx)这一行再看to_tuple,实际上是将原来的feature从 csr_matrix
转化为 coo_matrix
,并且输出特征向量coords, values, shape(有值位置的坐标,值,特征向量的shape)三要素作为元组。这里有两个矩阵,分别是 近接矩阵
和 节点特性向量矩阵
,由于这两个都是1,0稀疏格式因此采用scipy的稀疏矩阵格式,其中 邻接矩阵
采用 csr_matrix
方便计算对称归一化,而 特征矩阵
采用的是先lil_matrix方便做行切片,最后转化为 coo_matrix
,原因是特征矩阵需要使用占位符 placeholder
传入模型内部,而邻接矩阵是全局共享不变的不需要占位符,而稀疏站位符 tf.sparse_placeholder
的格式是(行列索引,值,shape)和coo_matrix对应,因此代码中最后转化为coo_matrix。
def preprocess_features(features)对节点的特征向量做行L1归一化,每一行的和是1,具体实现是创建了一个每一行和的倒数的对角矩阵乘以特征向量,sparse_to_tuple(features)最终数据类型与sparse_mx相同。
def chebyshev_polynomials(adj, k):
“””Calculate Chebyshev polynomials up to order k. Return a list of sparse matrices (tuple representation).”””
print(“Calculating Chebyshev polynomials up to order {}…”.format(k))
adj_normalized = normalize_adj(adj)
laplacian = sp.eye(adj.shape[0]) – adj_normalized
largest_eigval, _ = eigsh(laplacian, 1, which = ‘LM’)
scaled_laplacian = (2. / largest_eigval[0]) * laplacian – sp.eye(adj.shape[0])
t_k = list()
t_k.append(sp.eye(adj.shape[0]))
t_k.append(scaled_laplacian)
def chebyshev_recurrence(t_k_minus_one, t_k_minus_two, scaled_lap):
s_lap = sp.csr_matrix(scaled_lap, copy = True)
return 2 * s_lap.dot(t_k_minus_one) – t_k_minus_two
for i in range(2, k+1):
t_k.append(chebyshev_recurrence(t_k[-1], t_k[-2], scaled_laplacian))
return sparse_to_tuple(t_k)
t_k为list类型,size为4。t_k[0]为单位矩阵I,t_k[1]为经过变换的拉普拉斯矩阵,t_k[2]与t_k[3]分别为卷积核。
Original: https://www.cnblogs.com/irikin/p/16281585.html
Author: Link0216
Title: GCN代码阅读
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/567598/
转载文章受原作者版权保护。转载请注明原作者出处!