You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TensorFlow训练文本分类器时遇csr_matrix转Tensor报错求助

解决文本分类训练中的ValueError: Failed to convert a NumPy array to a Tensor问题

问题根源

  1. 稀疏矩阵转换错误:CountVectorizer.transform()返回的是csr_matrix稀疏矩阵,执行np.array(X_train)后,并未将其转为稠密数值数组,而是生成了包含单个csr_matrix对象的数组,TensorFlow无法识别该类型。
  2. 特征与模型层不匹配:CountVectorizer生成的是词频稀疏矩阵,而Embedding层需要的是文本的整数索引序列,两者输入格式完全冲突,这是核心设计问题。

解决方案

方案一:基于词频特征训练全连接模型

移除Embedding层,将稀疏矩阵转为稠密数组后直接训练:

import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tensorflow import keras 
from sklearn.feature_extraction.text import CountVectorizer

dataf = pd.read_csv('D:/datafile.csv')
X = dataf['text'].tolist()
y = dataf['target'].tolist()

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

vectorizer = CountVectorizer()
vectorizer.fit(X_train)
# *关键:用`toarray()`将稀疏矩阵转为稠密numpy数组*
X_train = vectorizer.transform(X_train).toarray()
X_test = vectorizer.transform(X_test).toarray()
y_train = np.array(y_train)
y_test = np.array(y_test)

# 构建适配词频特征的模型
model = keras.models.Sequential()
# 输入维度为CountVectorizer的特征总数
model.add(keras.layers.Dense(128, activation="relu", input_shape=(X_train.shape[1],)))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(64, activation="relu"))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(1, activation="sigmoid"))
model.summary()

model.compile("rmsprop", "binary_crossentropy", metrics=["accuracy"])
model.fit(X_train, y_train, epochs=5, verbose=True, validation_data=(X_test, y_test), batch_size=10)
model.save('gfgModel.h5')
tf.saved_model.save(model, 'one_step 05')

方案二:用Keras文本向量化配合Embedding+RNN模型

如果想保留RNN和Embedding层,改用Keras原生的TextVectorization生成整数索引序列:

import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tensorflow import keras 
from tensorflow.keras.layers import TextVectorization

dataf = pd.read_csv('D:/datafile.csv')
X = dataf['text'].tolist()
y = dataf['target'].tolist()

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 配置文本向量化层,生成整数索引序列
max_vocab = 10000
seq_len = 200  # 根据你的文本平均长度调整
vectorizer = TextVectorization(max_tokens=max_vocab, output_sequence_length=seq_len)
vectorizer.adapt(X_train)

# 转换数据为模型可接受的格式
X_train = vectorizer(np.array([[s] for s in X_train])).numpy()
X_test = vectorizer(np.array([[s] for s in X_test])).numpy()
y_train = np.array(y_train)
y_test = np.array(y_test)

# 构建RNN+Embedding模型
model = keras.models.Sequential()
model.add(keras.layers.Embedding(max_vocab, 128, input_length=seq_len))
model.add(keras.layers.SimpleRNN(64, return_sequences=True))
model.add(keras.layers.SimpleRNN(64))
model.add(keras.layers.Dense(128, activation="relu"))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(1, activation="sigmoid"))
model.summary()

model.compile("rmsprop", "binary_crossentropy", metrics=["accuracy"])
model.fit(X_train, y_train, epochs=5, verbose=True, validation_data=(X_test, y_test), batch_size=10)
model.save('gfgModel.h5')
tf.saved_model.save(model, 'one_step 05')

内容的提问来源于stack exchange,提问作者Raghavendra Bhat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:57:14