TFX Evaluator组件无法准备评估输入问题求助
问题分析与解决方案
错误本质
评估阶段模型期望输入feature1~feature4,但经过预处理后仅提供了*_mean类特征,导致输入特征与模型需求不匹配,进而触发输入准备失败的错误。核心矛盾在于评估时的特征处理逻辑、模型签名配置与无监督评估的需求不匹配。
具体解决方案
1. 修正Transform预处理函数
确保Transform组件的预处理函数只保留模型需要的feature1~feature4,移除*_mean类特征(这些仅用于追踪,无需传入模型):
def preprocessing_fn(inputs): # 仅保留模型输入特征 outputs = { 'feature1': inputs['feature1'], 'feature2': inputs['feature2'], 'feature3': inputs['feature3'], 'feature4': inputs['feature4'] } return outputs
2. 调整评估签名函数
无监督评估需要同时保留模型输入特征和*_mean标签用于追踪,因此修改_get_transform_features_signature,分离模型输入与标签特征:
def _get_transform_features_signature(model, tf_transform_output): model.tft_layer_eval = tf_transform_output.transform_features_layer() @tf.function(input_signature=[ tf.TensorSpec(shape=[None], dtype=tf.string, name='examples') ]) def transform_features_fn(serialized_tf_example): raw_feature_spec = tf_transform_output.raw_feature_spec() raw_features = tf.io.parse_example(serialized_tf_example, raw_feature_spec) # 分离模型输入特征(非_mean结尾)和标签特征(_mean结尾) model_inputs = {k: v for k, v in raw_features.items() if not k.endswith('_mean')} transformed_inputs = model.tft_layer_eval(model_inputs) # 追加标签特征到输出,供Evaluator追踪使用 transformed_inputs.update({k: v for k, v in raw_features.items() if k.endswith('_mean')}) logging.info('eval_transformed_features = %s', transformed_inputs) return transformed_inputs return transform_features_fn
3. 修正EvalConfig配置
适配无监督评估场景,调整签名与指标配置:
eval_config = tfma.EvalConfig( model_specs=[ tfma.ModelSpec( # 使用专门的评估签名,而非服务签名 signature_name='transform_features', # 保留label_key用于追踪需求 label_key='feature1_mean', # 评估签名已包含预处理逻辑,无需重复指定 preprocessing_function_names=None ) ], metrics_specs=[ tfma.MetricsSpec( metrics=[ tfma.MetricConfig(class_name='ExampleCount'), # 可选:添加自编码器专属评估指标(如输入与输出的MSE) tfma.MetricConfig(class_name='MeanSquaredError', label_key='feature1', prediction_key='outputs') ] ) ], slicing_specs=[ tfma.SlicingSpec() ])
4. 确认模型输入签名正确性
确保模型输入层明确对应feature1~feature4:
def build_model(): inputs = { 'feature1': tf.keras.layers.Input(shape=(15,1), name='feature1'), 'feature2': tf.keras.layers.Input(shape=(15,1), name='feature2'), 'feature3': tf.keras.layers.Input(shape=(15,1), name='feature3'), 'feature4': tf.keras.layers.Input(shape=(15,1), name='feature4'), } # 拼接输入特征 concatenated = tf.keras.layers.Concatenate()([v for v in inputs.values()]) # 自编码器结构(示例) encoder = tf.keras.layers.Dense(32, activation='relu')(concatenated) decoder = tf.keras.layers.Dense(60, activation='sigmoid')(encoder) # 重塑回原输入维度 output = tf.keras.layers.Reshape((4,15,1))(decoder) model = tf.keras.Model(inputs=inputs, outputs={'outputs': output}) model.compile(optimizer='adam', loss='mse') return model
内容的提问来源于stack exchange,提问作者Shayan
相关产品推荐
相关产品推荐

