使用TextVectorization遇输入维度错误,求技术解决方案
Keras TextVectorization层输入维度错误解决方法
错误核心原因
你的代码存在训练数据与模型结构不匹配的矛盾:
- 模型定义里包含了TextVectorization层,意味着它期望输入是原始文本字符串;
- 但调用
model.fit时,喂的是已经提前向量化的X_train_vec(二维张量,shape=(样本数, 特征数)),传给TextVectorization层后,不符合它要求的“输入为1维字符串张量”的规则,因此触发维度错误。
两种可行解决思路
思路1:模型内置TextVectorization层(推荐,支持直接处理文本)
这种方式下,训练时直接传入原始文本,由模型内部完成向量化,后续部署也能直接处理文本输入:
import tensorflow as tf from tensorflow import keras from tensorflow.keras.layers import Dense, Dropout # 初始化并适配向量层 vectorize_layer = tf.keras.layers.TextVectorization(max_tokens=30000, output_mode='tf_idf', ngrams=2,) vectorize_layer.adapt(X_train) # 构建模型:输入为原始文本 model = tf.keras.models.Sequential() model.add(tf.keras.Input(shape=(1,), dtype=tf.string)) model.add(vectorize_layer) model.add(Dense(256, activation='relu')) # 无需手动指定input_shape,向量层会自动输出正确维度 model.add(Dropout(0.5)) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(4, activation='softmax')) model.compile(optimizer='adamax', loss='categorical_crossentropy', metrics=['accuracy']) model.summary() callbacks = [keras.callbacks.ModelCheckpoint("model.keras", save_best_only=True)] # 直接传入原始文本训练 model.fit(X_train, y_train, epochs=15, batch_size=32, validation_data=(X_valid, y_valid), callbacks=callbacks) # 加载模型后可直接处理文本输入 model = keras.models.load_model('model.keras')
思路2:提前离线向量化,模型移除TextVectorization层
如果坚持提前完成文本向量化,需要从模型中去掉向量层,直接以向量作为输入:
import tensorflow as tf from tensorflow import keras from tensorflow.keras.layers import Dense, Dropout vectorize_layer = tf.keras.layers.TextVectorization(max_tokens=30000, output_mode='tf_idf', ngrams=2,) vectorize_layer.adapt(X_train) # 提前完成文本向量化 X_train_vec = vectorize_layer(X_train).numpy() X_test_vec = vectorize_layer(X_test).numpy() X_valid_vec = vectorize_layer(X_valid).numpy() # 构建模型:输入为向量的特征维度 model = tf.keras.models.Sequential() model.add(tf.keras.Input(shape=(X_train_vec.shape[1],))) # 输入维度为向量的特征数 model.add(Dense(256, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(4, activation='softmax')) model.compile(optimizer='adamax', loss='categorical_crossentropy', metrics=['accuracy']) model.summary() callbacks = [keras.callbacks.ModelCheckpoint("model.keras", save_best_only=True)] # 传入提前向量化后的张量训练 model.fit(X_train_vec, y_train, epochs=15, batch_size=32, validation_data=(X_valid_vec, y_valid), callbacks=callbacks) model = keras.models.load_model('model.keras')
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

