如何使用Keras将多文本特征的嵌入结果传入TFDF?
多文本特征嵌入后接入TFDF的解决方案
错误提示说明你的预处理器模型期望接收4个独立的输入张量,但实际传入的是一个形状为(None, 4)的单一张量。这是因为TFDF默认会将多个文本特征打包成一个张量输入,而你的预处理器定义的是4个单独的Input层,两者不匹配。以下是两种可行的解决方法:
方案1:修改预处理器,适配单张量输入
将预处理器的输入改为接受一个形状为(None, 4)的字符串张量,拆分后分别编码,再拼接所有编码结果:
import tensorflow as tf import tensorflow_decision_forests as tfdf import tensorflow_hub as hub from tensorflow import keras from tensorflow.keras import layers sentence_encoder_layer = hub.KerasLayer( "https://tfhub.dev/google/universal-sentence-encoder/4" ) # 定义输入为形状(None, 4)的字符串张量 inputs = layers.Input(shape=(4,), dtype=tf.string) # 拆分每个文本特征并去除多余维度 split_features = tf.split(inputs, num_or_size_splits=4, axis=1) split_features = [tf.squeeze(feat, axis=1) for feat in split_features] # 分别编码每个特征 encoded_features = [sentence_encoder_layer(feat) for feat in split_features] # 拼接所有编码后的特征 outputs = layers.concatenate(encoded_features, axis=1) # 创建预处理器并初始化TFDF模型 preprocessor = keras.Model(inputs=inputs, outputs=outputs) model = tfdf.keras.GradientBoostedTreesModel(preprocessing=preprocessor)
方案2:以字典形式输入数据,匹配多输入预处理器
如果你的数据是以字典形式组织(每个特征对应一个键),可以保持多输入的预处理器,同时确保训练时传入字典格式的数据:
import tensorflow as tf import tensorflow_decision_forests as tfdf import tensorflow_hub as hub from tensorflow import keras from tensorflow.keras import layers sentence_encoder_layer = hub.KerasLayer( "https://tfhub.dev/google/universal-sentence-encoder/4" ) FEATURES = ['feat1', 'feat2', 'feat3', 'feat4'] def create_model_inputs(): inputs = {} for feature_name in FEATURES: inputs[feature_name] = layers.Input( name=feature_name, shape=(), dtype=tf.string ) return inputs # 创建多输入预处理器 inputs = create_model_inputs() encoded_features = [] for feature_name in FEATURES: encoded = sentence_encoder_layer(inputs[feature_name]) encoded_features.append(encoded) outputs = layers.concatenate(encoded_features, axis=1) preprocessor = keras.Model(inputs=inputs, outputs=outputs) model = tfdf.keras.GradientBoostedTreesModel(preprocessing=preprocessor) # 训练时需传入字典格式数据,示例: # 假设train_data是tf.data.Dataset,每个元素为{'feat1': str, 'feat2': str, ..., 'label': int} model.fit(train_data)
注意事项
- 方案1适合数据被打包成张量的场景,方案2适合数据以字典形式存储的情况,可根据你的数据格式选择。
- 拼接编码后的特征是必要操作,因为TFDF需要接收统一的特征张量作为输入。
内容的提问来源于stack exchange,提问作者toille
相关产品推荐
相关产品推荐

