TensorFlow中如何计算给定稀疏矩阵数据的余弦相似度



我应该在GitHub网站上更改部分python脚本。这段代码是一个基于注意力的相似性度量,但我想把它变成余弦相似性。

相应的代码在layers.py文件中(在调用方法中(。

基于注意力:

def __call__(self, inputs):
x = inputs
# dropout
if self.sparse_inputs:
x = sparse_dropout(x, 1-self.dropout, self.num_features_nonzero)
else:
x = tf.nn.dropout(x, 1-self.dropout)
# graph learning
h = dot(x, self.vars['weights'], sparse=self.sparse_inputs)
N = self.num_nodes
edge_v = tf.abs(tf.gather(h,self.edge[0]) - tf.gather(h,self.edge[1]))
edge_v = tf.squeeze(self.act(dot(edge_v, self.vars['a'])))
sgraph = tf.SparseTensor(indices=tf.transpose(self.edge), values=edge_v, dense_shape=[N, N])
sgraph = tf.sparse_softmax(sgraph)
return h, sgraph

我根据自己的要求编辑了上面的代码(余弦相似性(。然而,当我运行以下代码时,就像这样:

def __call__(self, inputs):
x = inputs
# dropout
if self.sparse_inputs:
x = sparse_dropout(x, 1-self.dropout, self.num_features_nonzero)
else:
x = tf.nn.dropout(x, 1-self.dropout)
# graph learning
h = dot(x, self.vars['weights'], sparse=self.sparse_inputs)
N = self.num_nodes
h_norm = tf.nn.l2_normalize(h)
edge_v = tf.matmul(h_norm, tf.transpose(h_norm))
h_norm_1 = tf.norm(h_norm)
edge_v /= h_norm_1 * h_norm_1
edge_v = dot(edge_v, self.vars['a']) # It causes an error when I add this line
zero = tf.constant(0, dtype=tf.float32)
where = tf.not_equal(edge_v, zero)
indices = tf.where(where)
values = tf.gather_nd(edge_v, indices)
sgraph = tf.SparseTensor(indices, values, dense_shape= [N,N])
return h, sgraph

脚本显示一些运行时错误:

错误消息屏幕截图

我怀疑这里的错误与第226行有关:

edge_v = dot(edge_v, self.vars['a']) # It causes an error when I add this line

关于如何成功实现这一目标,有什么忠告吗

GitHub:上的脚本链接

https://github.com/jiangboahu/GLCN-tf

注意:我不想使用内置函数,因为我认为它们不适合做这项工作。

ETA:似乎有一些答案,但据我所知,它们似乎解决了不同的问题。

提前感谢

什么是?你引进这种方法了吗?

它应该是:

edge_v = tf.keras.backend.dot(edge_v, self.vars['a'])

edge_v = tf.tensordot(edge_v, self.vars['a'])

最新更新