Ошибка типа: не удалось преобразовать объект типа в тензор

#python #tensorflow #scikit-learn #cosine-similarity

#python #тензорный поток #scikit-learn #косинусное подобие

Вопрос:

Я пытаюсь вычислить косинусное сходство между 350 тыс. предложений с помощью tensorflow.

Мои предложения сначала vectorisd с использованием sklearn:

 doc =  df['text']
vec = TfidfVectorizer(binary=False,norm='l2',use_idf=False,smooth_idf=False,lowercase=True,stop_words='english',min_df=1,max_df=1.0,max_features=None,ngram_range=(1, 1))
X = vec.fit_transform(doc)
print(X.shape)
print(type(X))
  

Это работает очень хорошо, и я получаю разреженную матрицу обратно, затем я попробовал двумя способами преобразовать мою разреженную матрицу в плотную.

(1) Я попробовал это:

 dense = X.toarray()
  

Это работает только с небольшим объемом данных (около 10 тыс. предложений), но затем завершается ошибкой при фактическом вычислении.

(2) Я пытался преобразовать выходные X данные таким образом, но получаю то же сообщение об ошибке при выполнении первого шага K :

 K = tf.convert_to_tensor(X, dtype=None, dtype_hint=None, name=None)
Y = tf.sparse.to_dense(K, default_value=None, validate_indices=True, name=None)
  

Любые советы / рекомендации по разгадке этой тайны были бы весьма признательны. Также рад рассмотреть возможность пакетной обработки моих вычислений, если это должно быть более эффективным с точки зрения размера?

Ответ №1:

Вам нужно создать разреженную матрицу тензорного потока из вашей SciPy. Поскольку ваша матрица, похоже, находится в формате CSR, вы можете сделать это следующим образом:

 import numpy as np
import scipy.sparse
import tensorflow as tf

def sparse_csr_to_tf(csr_mat):
    indptr = tf.constant(csr_mat.indptr, dtype=tf.int64)
    elems_per_row = indptr[1:] - indptr[:-1]
    i = tf.repeat(tf.range(csr_mat.shape[0], dtype=tf.int64), elems_per_row)
    j = tf.constant(csr_mat.indices, dtype=tf.int64)
    indices = np.stack([i, j], axis=-1)
    data = tf.constant(csr_mat.data)
    return tf.sparse.SparseTensor(indices, data, csr_mat.shape)

# Test
m = scipy.sparse.csr_matrix([
    [0, 0, 1, 0],
    [0, 0, 0, 0],
    [2, 0, 3, 4],
], dtype=np.float32)
tf_mat = sparse_csr_to_tf(m)
tf.print(tf.sparse.to_dense(tf_mat))
# [[0 0 1 0]
#  [0 0 0 0]
#  [2 0 3 4]]
  

Комментарии:

1. спасибо за ваше предложение! К сожалению, ваше решение выдает другое сообщение об ошибке в строке tf_mat = sparce_csr_to_tf(m): «NotImplementedError: не удается преобразовать символьный тензор (Repeat/boolean_mask /GatherV2:0) в массив numpy» — просто чтобы уточнить, я пытался ввести свою матрицу X из примера выше, верно?

2. @msa Ну, это просто преобразует разреженную матрицу CSR в разреженную матрицу тензорного потока, если вы хотите вернуться к NumPy позже, вам нужно будет использовать .numpy() (для плотного тензора, предполагая, что вы находитесь в режиме ожидания). Однако, если проблема в том, что результирующая матрица слишком велика для вашей системы, я не думаю, что использование TensorFlow поможет с этим…