微调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
相关产品推荐
相关产品推荐

