【问题标题】:How to get the hidden states of a fine-tuned TFBertModel?如何获得微调的 TFBertModel 的隐藏状态?
【发布时间】:2021-05-18 23:49:27
【问题描述】:

我首先在文本分类任务上微调 Bert 模型,然后我想在 TensorFlow 中获得微调模型的嵌入。不幸的是,我只能在第一行下载预训练的 Bert 模型时说 output_hidden_states=True,但在创建 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])),以便我可以得到一个句子的所有微调标记嵌入的平均值。

【问题讨论】:

  • 你在用拥抱脸库吗?
  • 是的,我编辑了问题并添加了导入模型的方式。

标签: python tensorflow deep-learning nlp huggingface-transformers


【解决方案1】:

您可以使用get_input_embeddings 函数检索嵌入:

model = build_custome_model():

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

【讨论】:

  • 感谢您的评论。问题是这个模型在微调后只输出了 5 个标签。我想要的是还能够获得我在数据集上对其进行训练后给出的句子的编码(嵌入),并获得每个句子的平均嵌入。我尝试将隐藏状态添加到 tf.Keras.Model 的输出中,但训练过程变得非常缓慢。
  • 你想要所有隐藏状态(即每个 BertEncoder 层的输出)还是只想要最后一个隐藏状态的输出? @mitramirshafiee
  • 我只想要嵌入(模型最后一个输出的第一层,即 modelOutput [2][0] 或 modelOutput[''hidden_​​states''][0])来获得平均值在具有 5 个标签的数据集上训练模型后的所有令牌嵌入。
  • @mitramirshafiee 对不起,我首先误解了你。我认为培训正在减慢,因为你正在填满你的 RAM。您可能正在寻找model.layers[3].get_input_embeddings()(input_ids)。如果这是您正在寻找的内容,我将编辑我的问题。
  • 不,它返回实际的嵌入层(即在训练之后)。它看起来相似只是表明您的数据与用于 BERT 预训练的数据没有太大区别。 @mitramirshafiee
猜你喜欢
  • 2020-06-08
  • 2020-11-16
  • 2018-09-19
  • 1970-01-01
  • 2020-07-15
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多