TypeError:无法将 <class 'scipy.sparse.csr.csr_matrix'> 类型的对象转换为张量

Posted

技术标签:

【中文标题】TypeError:无法将 <class \'scipy.sparse.csr.csr_matrix\'> 类型的对象转换为张量【英文标题】:TypeError: Failed to convert object of type <class 'scipy.sparse.csr.csr_matrix'> to TensorTypeError:无法将 <class 'scipy.sparse.csr.csr_matrix'> 类型的对象转换为张量 【发布时间】:2021-01-15 02:27:02 【问题描述】:

我正在尝试使用 tensorflow 计算 350k 句子之间的余弦相似度。

我的句子首先是使用 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()

这仅适用于少量数据(大约 10k 句子),但在实际计算中会失败。

(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 中创建一个 TensorFlow 稀疏矩阵。由于您的矩阵似乎是 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]]

【讨论】:

感谢您的建议!不幸的是,您的解决方案在 tf_mat = sparce_csr_to_tf(m) 行上引发了另一条错误消息:“NotImplementedError: Cannot convert a symbolic Tensor (Repeat/boolean_mask/GatherV2:0) to a numpy array” - 只是为了澄清我试图输入我的上例中的矩阵 X,对吧? @msa 好吧,这只是将 CSR 稀疏矩阵转换为 TensorFlow 稀疏矩阵,如果你想稍后回到 NumPy,你需要使用 .numpy()(在密集张量上,假设你处于渴望模式)。但是,如果问题是生成的矩阵对于您的系统来说太大了,我认为使用 TensorFlow 不会有帮助...

以上是关于TypeError:无法将 <class 'scipy.sparse.csr.csr_matrix'> 类型的对象转换为张量的主要内容,如果未能解决你的问题,请参考以下文章

numpy 引发错误:TypeError:无法推断类型的架构:<class 'numpy.float64'>

TypeError:无法使用这些索引器对 <class 'pandas.indexes.base.Index'> 进行标签索引

TypeError:无法连接类型为“<class 'yfinance.ticker.Options'>”的对象;只有 Series 和 DataFrame obj 是有效的

如何解决 TypeError:无法将系列转换为 <type 'float'>

TypeError:无法将值 dtype('<M8[ns]') 转换为 TensorFlow DType

类型错误:无法克隆对象 '<class 'sklearn.svm._classes.SVC'>'