Keras训练sklearn生成的TF-IDF矩阵报indices out of order错误如何处理
问题原因
报错原因是sklearn的TfidfVectorizer输出的是scipy格式的稀疏矩阵,当Keras(TensorFlow后端)自动将其转换为tf.SparseTensor时,稀疏矩阵的索引没有按TensorFlow要求的行优先顺序排序,因此触发了参数校验错误。
解决方案
方案1:小数据集直接转稠密矩阵(最简单)
你的数据量仅917条、特征维度2783,转成稠密矩阵的内存占用可以忽略,直接修改一行代码即可解决:
tfidf = vectorizer.fit_transform(texts) # 新增下面这行,把稀疏矩阵转成numpy稠密数组 tfidf = tfidf.toarray()
方案2:保留稀疏格式,按要求重排索引
如果后续数据量增大不想占用过多内存,可以按照错误提示对稀疏张量做重排序,修改代码如下:
import tensorflow as tf import numpy as np # ... 原有其他代码不变 ... tfidf = vectorizer.fit_transform(texts) # 新增以下代码,完成scipy稀疏矩阵到排序后TF稀疏张量的转换 coo_mat = tfidf.tocoo() indices = np.column_stack((coo_mat.row, coo_mat.col)) tfidf_sparse = tf.sparse.SparseTensor( indices=indices, values=coo_mat.data.astype(np.float32), dense_shape=coo_mat.shape ) tfidf_sparse_ordered = tf.sparse.reorder(tfidf_sparse) # 训练时传入重排序后的稀疏张量即可 mlp.fit(tfidf_sparse_ordered, labels_onehot, epochs=100)
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

