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

Keras拼接Embedding与CategoryEncoding层报错解决方法

错误原因

从打印的层形状可以直接定位问题:

  • 嵌入层、数值特征处理后的输出都是2阶张量,形状格式为(None, 特征维度),其中None代表动态batch维度,符合Keras层的标准输出格式。
  • 两个独热层的输出是1阶张量,形状为(7,)、(5,),完全丢失了batch维度,和其他层的张量秩不匹配,自然无法通过Concatenate层拼接。

出现维度丢失的根因:独热分类特征对应的输入层输出是形状为(None,)的rank 1张量(每个位置对应一个样本的整数类别ID,仅含batch维度,没有特征轴),直接传入CategoryEncoding层时,层会将整个batch维度误判为单个样本的特征序列,最终输出形状仅为(vocab_size,),吃掉了batch维度。另外代码中重复定义了两次独热层,第一版实验性接口的计算结果被直接覆盖,属于冗余代码。

修复方法
  • 删除冗余的第一版keras.layers.experimental.preprocessing.CategoryEncoding定义代码。
  • 独热特征传入CategoryEncoding层前,先和数值特征做一样的扩维操作,补充最后一维的特征轴,让层能正确识别batch维度,输出带batch维的2阶张量。
    修复后的独热特征处理代码如下:
elif feature_name in features.ONEHOT_CATEGORICAL_FEATURE_NAMES:
    vocab_size = feature_vocab_sizes[feature_name]
    # 扩维补充特征轴,将输入形状从(None,)转为(None,1)
    onehot_input = tf.expand_dims(input_layers[key], -1)
    onehot_layer = tf.keras.layers.CategoryEncoding(
        num_tokens=vocab_size, 
        output_mode="one_hot",
        name=f"{key}_onehot",
    )(onehot_input)

    print(f"Shape of one hot layer [{key}] has None [{onehot_layer.shape}]")
                
    layers.append(onehot_layer)
  • 修复后重新运行,独热层输出形状会变为(None, 7)、(None, 5),和其他层的张量格式完全对齐,Concatenate层即可正常完成拼接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:42:15