使用TensorFlow训练文本分类器时遇csr_matrix转Tensor报错求助
解决文本分类训练中的
ValueError: Failed to convert a NumPy array to a Tensor问题 问题根源
- 稀疏矩阵转换错误:
CountVectorizer.transform()返回的是csr_matrix稀疏矩阵,执行np.array(X_train)后,并未将其转为稠密数值数组,而是生成了包含单个csr_matrix对象的数组,TensorFlow无法识别该类型。 - 特征与模型层不匹配:
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
相关产品推荐
相关产品推荐

