Предположим, что вы хотите сравнить два разреженных тензора, и у вас есть числа в них, я думаю, что проще всего вычесть одно из другого и сохранить получающиеся ненулевые значения как "True" с tf.sparse_retain()
.Ответ DomJack работает только в том случае, если вы хотите сравнить разреженный тензор с константой, но это намного проще с tf.sparse_retain()
, как функция sparse_not_equal_to_constant()
ниже.(Обратите внимание, что это не точная операция not_equal , поскольку она проверяет только существующие значения на неравенство. Поскольку неперечисленные элементы разреженного тензора равны нулю, если сравниваемая константа сама по себе не равна нулю, тогда остальная часть матрицы также должна быть помечена как не равная. Лучше всего это сделать при обратном преобразовании в плотное с параметром default_value
, но с учетом того, где матрица имела значения для начала.) Протестированный код для сравнения двух разреженных тензоров, включая функцию для сравнения с константой:
import tensorflow as tf
import numpy as np
def sparse_not_equal_to_constant( s, c ):
a = tf.sparse_retain( s, tf.not_equal( c, s.values ) )
return tf.SparseTensor( a.indices, tf.ones_like( a.values, dtype = tf.bool ), dense_shape = s.dense_shape )
def sparse_not_equal( a, b ):
neg_b = tf.SparseTensor( b.indices, -b.values, dense_shape = b.dense_shape )
difference = tf.sparse_add( a, neg_b )
return sparse_not_equal_to_constant( difference, 0.0 )
# test data
a = tf.SparseTensor( [ [ 0, 0 ], [ 1, 4 ], [ 2, 3 ] ], [ 5.0, 6, 7 ], dense_shape = ( 5, 5 ) )
b = tf.SparseTensor( [ [ 0, 0 ], [ 0, 2 ], [ 2, 3 ] ], [ 5.0, 6, 2 ], dense_shape = ( 5, 5 ) )
e = sparse_not_equal( a, b )
f = tf.sparse_tensor_to_dense( e, default_value = False )
with tf.Session() as sess:
print( sess.run( f ) )
Выходы:
[[False False True False False]
[False False False False True]
[False False False True False]
[False False False False False False]
[False False False False False]]
как ожидалось.