Как сделать tf.not_equal () на разреженном тензоре? - PullRequest
0 голосов
/ 26 апреля 2018

Я получаю TypeError: Failed to convert object.Есть ли способ сделать tf.not_equal() или эквивалентный на разреженном тензоре?Это должно остаться разреженным;преобразование в плотное не допускается.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Предположим, что вы хотите сравнить два разреженных тензора, и у вас есть числа в них, я думаю, что проще всего вычесть одно из другого и сохранить получающиеся ненулевые значения как "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]]

как ожидалось.

0 голосов
/ 26 апреля 2018

Я думаю, вам придется работать с индексами / значениями независимо.

import numpy as np
import tensorflow as tf


def sparse_not_equal(sparse_tensor, value):
    indices = sparse_tensor.indices
    values = sparse_tensor.values
    condition = tf.squeeze(tf.where(tf.not_equal(values, 2)), axis=-1)
    indices = tf.gather(indices, condition)
    values = tf.ones(shape=(tf.shape(indices)[0],), dtype=tf.bool)
    return tf.SparseTensor(
      indices,
      values,
      sparse_tensor.dense_shape)


def get_sparse():
    vals = tf.constant([2, 3, 4, 2])
    indices = tf.constant(np.array([[1], [4], [5], [10]]))
    dense_shape = [16]
    return tf.SparseTensor(indices, vals, dense_shape)


sparse_tensor = get_sparse()
sparse_filtered = sparse_not_equal(sparse_tensor, 2)


with tf.Session() as sess:
    s = sess.run(sparse_filtered)

print(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...