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

Colab加载DistilBERT模型报错:KerasTensor不被input_ids接受

问题分析与修复方案

报错根源

报错核心是输入参数传递方式错误:你将input_ids和attention_mask打包成列表传给了TFDistilBertModel,导致模型误把两个KerasTensor都当成了input_ids的输入,触发类型不匹配校验。TF版DistilBERT需要分别接收input_ids和attention_mask参数,而非将两者合并为一个列表传入。

另外,Colab与本地环境的transformers/tensorflow版本差异也可能是诱因——Colab默认库版本可能和你本地不一致,新版本对KerasTensor的兼容性逻辑有调整。

修复步骤

1. 修正模型调用方式

将原代码中调用DistilBERT的行:

last_hidden_state = transformer([input_ids_layer, input_attention_layer])[0]

改为关键字参数传递(最稳妥,避免顺序混淆):

last_hidden_state = transformer(input_ids=input_ids_layer, attention_mask=input_attention_layer)[0]

2. 对齐Colab与本地库版本

在Colab开头执行以下命令,安装和本地一致的transformers与tensorflow版本(替换为你本地的版本号):

!pip install transformers==4.30.0 tensorflow==2.12.0

完整修复后代码

MAX_LENGTH = 256
LAYER_DROPOUT = 0.5
LEARNING_RATE = 1e-4
RANDOM_STATE = 42

def build_model(transformer, max_length=MAX_LENGTH):
    # 定义权重初始化器,设置随机种子保证可复现
    weight_initializer = tf.keras.initializers.GlorotNormal(seed=RANDOM_STATE) 

    # 定义输入层
    input_ids_layer = tf.keras.layers.Input(shape=(max_length,), 
                                        name='input_ids', 
                                        dtype='int32')
    input_attention_layer = tf.keras.layers.Input(shape=(max_length,),
                                              name='input_attention', 
                                              dtype='int32')

    # DistilBERT输出元组,索引0的元素是模型最后一层的隐藏状态
    # 形状为 (batch_size, sequence_length, hidden_size=768)
    last_hidden_state = transformer(input_ids=input_ids_layer, attention_mask=input_attention_layer)[0]

    # 只取[CLS] token的输出,位于每个编码序列的索引0位置
    # 切片后得到二维数据
    cls_token = last_hidden_state[:, 0, :]

    dense_layer1 = tf.keras.layers.Dense(256, 
                               activation='relu',
                               kernel_initializer=weight_initializer,  
                               kernel_constraint=None,
                               bias_initializer='zeros'
                               )(cls_token)

    dropout_layer1=tf.keras.layers.Dropout(LAYER_DROPOUT)(dense_layer1)
    dense_layer2 = tf.keras.layers.Dense(256, 
                               activation='relu',
                               kernel_initializer=weight_initializer,  
                               kernel_constraint=None,
                               bias_initializer='zeros'
                               )(dropout_layer1)

    dropout_layer2=tf.keras.layers.Dropout(LAYER_DROPOUT)(dense_layer2)
    dense_layer3 = tf.keras.layers.Dense(32, 
                               activation='relu',
                               kernel_initializer=weight_initializer,  
                               kernel_constraint=None,
                               bias_initializer='zeros'
                               )(dropout_layer2)

    dropout_layer3=tf.keras.layers.Dropout(LAYER_DROPOUT)(dense_layer3)

    # 定义输出层(二分类任务,单节点)
    output = tf.keras.layers.Dense(1, 
                               activation='sigmoid',
                               kernel_initializer=weight_initializer,  
                               kernel_constraint=None,
                               bias_initializer='zeros'
                               )(dropout_layer3)

    # 定义模型
    model = tf.keras.Model([input_ids_layer, input_attention_layer], output)

    # 编译模型
    model.compile(tf.keras.optimizers.Adam(learning_rate=LEARNING_RATE), 
              loss=tf.keras.losses.BinaryFocalCrossentropy(),
              metrics=['accuracy'])
    return model 

model=build_model(distilBERT)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:56:29