python - 如何获取微调后的 TFBertModel 的隐藏状态?

标签 python tensorflow deep-learning nlp huggingface-transformers

我首先在文本分类任务上微调 Bert 模型,然后我想在 TensorFlow 中获得微调模型的嵌入。不幸的是,我只能说output_hidden_states=True ,在第一行中,我下载了预训练的 Bert 模型,但不在第二阶段中,我创建了 tf.Keras.Model 。以下是我如何制作和训练模型的代码:

max_len = 55

from transformers import BertConfig, BertTokenizer, TFBertModel

def build_custome_model():
    bert_encoder = TFBertModel.from_pretrained(Base_BERT_Path)

    input_word_ids = tf.keras.Input(shape=(max_len,), dtype=tf.int32, name="input_word_ids")
    input_mask = tf.keras.Input(shape=(max_len,), dtype=tf.int32, name="input_mask")
    input_type_ids = tf.keras.Input(shape=(max_len,), dtype=tf.int32, name="input_type_ids")
    
    embedding = bert_encoder([input_word_ids, input_mask, input_type_ids])[0]
    clf_output = embedding[:,0,:]

    net = tf.keras.layers.Dropout(0.4)(clf_output)
    output = tf.keras.layers.Dense(5, activation='softmax')(net)
    
    model = tf.keras.Model(inputs=[input_word_ids, input_mask, input_type_ids], outputs=output)

    model.compile(tf.keras.optimizers.Adam(lr=1e-5), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
    
    return model

然后我在包含 2 个句子的数据集上训练模型,并为其相似性评分

#------Training with stratifiedkfold-------


k = 5
kfold = StratifiedKFold(n_splits = k, shuffle = True)

for i, (train_idx, val_idx) in enumerate(kfold.split(first_sentences, labels.score), 1):

    epoch_evaluation = {}

    train_input = create_input(np.array(first_sentences)[train_idx], np.array(second_sentences)[train_idx], tokenizer, max_len=max_seq_length)
    validation_input = create_input(np.array(first_sentences)[val_idx], np.array(second_sentences)[val_idx], tokenizer, max_len=max_seq_length)

    history = model.fit(x = train_input, y = labels.loc[train_idx, 'score'],
                        validation_data= (validation_input, labels.loc[val_idx, 'score']),
                        epochs = 5,
                        verbose = 1,
                        batch_size = 8)

我的目标是在最后建立一个模型,该模型在此数据集上进行训练,并且每当我给它一个句子时就可以输出嵌入(隐藏状态的第一层(输出[2][0])),以便我可以获得句子中所有经过微调的标记嵌入的平均值。

最佳答案

您可以使用 get_input_embeddings 检索嵌入功能:

model = build_custome_model():

model.layers[3].get_input_embeddings()(input_ids)

关于python - 如何获取微调后的 TFBertModel 的隐藏状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66219090/

相关文章:

python - 拟合高斯分布,必须使用 python 中提供的均值

python - 使用递归创建随机元素列表

tensorflow 自定义循环不会在第一个纪元结束并且进度条运行到无限

python - AdamW 的衰减学习率计划如何影响权重衰减参数?

neural-network - 如何在torch中编写updateGradInput和accGradParameters?

python - Django非唯一查询

python - 如何将数据添加到二进制文件中?

python - 如何重命名 Tensorflow 中操作的输入张量名称?

python - 过度拟合——训练和验证准确性之间的巨大差异

python - Theano中的借用参数是什么