运行atten_head函数时,报错“AttributeError: ‘int’ object has no attribute ‘value’”
def attn_head(seq, out_sz, bias_mat, activation, in_drop=0.0, coef_drop=0.0, residual=False):
# seq 指的是输入的节点特征矩阵,大小为 [num_graph, num_node, fea_size]
# out_szie指的是变换后的节点特征维度
# bias_mat 是经过变换后的邻接矩阵,大小为 [num_node, num_node]。
with tf.name_scope('my_attn'):
if in_drop != 0.0:
seq = tf.nn.dropout(seq, 1.0 - in_drop)
seq_fts = seq
latent_factor_size = 8
# 初始化权重
w_1 = glorot(seq_fts.shape[2].value,latent_factor_size)
w_2 = glorot([2 * seq_fts.shape[2].value, latent_factor_size])
# 最简单的自我关注
f_1 = tf.keras.layers.Conv1D(seq_fts, 1, 1)
f_2 = tf.keras.layers.Conv1D(seq_fts, 1, 1)
logits = f_1 + tf.transpose(f_2, [0, 2, 1])
#但是,这里为什么会多一项 bias_mat 呢?
#因为的 logits 存储了任意两个节点之间的注意力值,但是,归一化只需要对每个节点的所有邻居的注意力进行(k属于Ni)。
# 所以,引入了 bias_mat 就是将 softmax 的归一化对象约束在每个节点的邻居上,如下式的红色部分。
# 将bias_mat和注意力矩阵相加,即(tf.nn.leaky_relu(logits) + bias_mat), 进而将非节点邻居进行mask。
coefs = tf.nn.softmax(tf.nn.leaky_relu(logits[0]) + bias_mat[0])
if coef_drop != 0.0:
coefs = tf.nn.dropout(coefs, 1.0 - coef_drop)
if in_drop != 0.0:
seq_fts = tf.nn.dropout(seq_fts, 1.0 - in_drop)
#将 mask 之后的注意力矩阵 coefs 与变换后的特征矩阵 seq_fts 相乘,即可得到更新后的节点表示 vals。
neigh_embs = tf.matmul(coefs, seq_fts[0])
#tf.add() 将参数相加
neigh_embs_aggre_1 = tf.matmul(tf.add(seq_fts[0],neigh_embs),w_1)
# tf.matmul()将矩阵a乘以矩阵b,生成a * b。
neigh_embs_aggre_2 = tf.matmul(tf.concat([seq_fts[0],neigh_embs],axis=-1),w_2)
# 激活
final_embs = activation(neigh_embs_aggre_1) + activation(neigh_embs_aggre_2)
return final_embs, coefs
有大神知道怎么解决么?在网上找了一圈也没找到办法 哭了
版权声明:本文为qq_41523037原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。