Прежде чем передать свои токены через BERT, я хотел бы выполнить некоторую обработку их вложений (результат слоя поиска внедрения). Реализация HuggingFace BERT TensorFlow позволяет нам получить доступ к выводу встраиваемого поиска, используя:
import tensorflow as tf
from transformers import BertConfig, BertTokenizer, TFBertModel
bert_tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
input_ids = tf.constant(bert_tokenizer.encode("Hello, my dog is cute", add_special_tokens=True))[None, :]
attention_mask = tf.stack([tf.ones(shape=(len(sent),)) for sent in input_ids])
token_type_ids = tf.stack([tf.ones(shape=(len(sent),)) for sent in input_ids])
config = BertConfig.from_pretrained('bert-base-uncased', output_hidden_states=True)
bert_model = TFBertModel.from_pretrained('bert-base-uncased', config=config)
result = bert_model(inputs={'input_ids': input_ids,
'attention_mask': attention_mask,
'token_type_ids': token_type_ids})
inputs_embeds = result[-1][0] # output of embedding lookup
Впоследствии можно обработать inputs_embeds
и затем отправить его в качестве ввода в тот же модель использует:
inputs_embeds = process(inputs_embeds) # some processing on inputs_embeds done here (dimensions kept the same)
result = bert_model(inputs={'inputs_embeds': inputs_embeds,
'attention_mask': attention_mask,
'token_type_ids': token_type_ids})
output = result[0]
, где output
теперь содержит вывод BERT для измененного ввода. Однако для этого требуется два полных прохода через BERT. Вместо того, чтобы запускать BERT полностью, просто чтобы выполнить встраивание, я хотел бы просто получить вывод слоя встраивания. Возможно ли это, и если да, то как?