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

微调CodeBert时model.summary()未显示模型层且疑似训练异常的问题求助

微调CodeBert时model.summary()未显示模型层且疑似训练异常的问题求助

大家好,我现在在用自定义数据集和Tokenizer微调CodeBert模型,目标是解冻模型的最后4层做针对性微调。目前代码运行时能打印出最后4层处于可训练状态,但调用model.summary()的时候,完全看不到CodeBert的任何层结构,而且感觉模型根本没在训练这些解冻的层。之前用BertModel跑类似逻辑的代码时,model.summary()里能正常看到TFBertLayer,参数也有大概1.1M,现在这个情况让我特别困惑。

先贴一下我使用的完整代码:

def create_model(
    bert_model_name="microsoft/codebert-base",
    num_classes=442,
    dense_units=[628, 528],
    dropout_rate=0.3,
    learning_rate=1e-4,
    trainable_bert=False,
):
    def bert_layer(inputs):
        last_hidden = bert_model(inputs).last_hidden_state
        return last_hidden[:, 0, :]

    bert_model = RobertaModel.from_pretrained(bert_model_name)
    bert_model.trainable = trainable_bert

    # 解冻最后4层
    for i, layer in enumerate(bert_model.roberta.encoder.layer):
        if i < len(bert_model.roberta.encoder.layer) - 4:
            layer.trainable = False
        if layer.trainable:
            print(layer.name, "is trainable")

    input_ids = tf.keras.Input(shape=(512,), dtype=tf.int32, name="input_ids")
    attention_mask = tf.keras.Input(shape=(512,), dtype=tf.int32, name="attention_mask")

    x = tf.keras.layers.Lambda(
        bert_layer, output_shape=(768,)
    )({"input_ids": input_ids, "attention_mask": attention_mask})

    for units in dense_units:
        x = tf.keras.layers.Dense(units)(x)
        x = tf.keras.layers.BatchNormalization()(x)
        x = tf.keras.layers.Activation("relu")(x)
        x = tf.keras.layers.Dropout(dropout_rate)(x)

    output = tf.keras.layers.Dense(num_classes, activation="linear")(x)
    model = tf.keras.Model(inputs=[input_ids, attention_mask], outputs=output)

    model.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate),
        loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
        metrics=[lambda y_true, y_pred: positive_class_accuracy(y_true, y_pred, k=5, prob_threshold=0.01)]
    )
    return model

运行代码时控制台会输出:

layer_._8 is trainable
layer_._9 is trainable
layer_._10 is trainable
layer_._11 is trainable

但调用返回模型的summary()方法,只能看到我后续添加的Dense、BatchNormalization这些自定义层,完全看不到CodeBert的编码器层结构。我怀疑是不是用Lambda层包裹bert_layer的方式有问题,导致Keras没法追踪到CodeBert的层?

另外因为看不到这些层,我也不确定解冻的层是不是真的在参与训练,想请教大家:

  • 为什么model.summary()里看不到CodeBert的层?
  • 这段代码的逻辑有没有问题,是不是没正确让最后4层参与训练?
  • 怎么调整才能让CodeBert的层显示在summary里,同时确保解冻的层真的在被训练?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 12:27:57