Как получить скрытые состояния тонко настроенной модели TFBertModel?

Сначала я точно настраиваю модель Берта для задачи классификации текста, а затем я хочу получить вложения точно настроенной модели в TensorFlow. К сожалению, я могу сказать только 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

Затем я тренирую модель на наборе данных с двумя предложениями и в качестве оценки их сходства

#------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)

Моя цель - иметь в конце модель, которая обучена на этом наборе данных и может выводить вложения (первый уровень скрытых состояний (output [2] [0])) всякий раз, когда я даю ей предложение, чтобы я мог получить означает всех точно настроенных встраиваний лексем в предложение.


person mitra mirshafiee    schedule 16.02.2021    source источник
comment
вы используете библиотеку обнимающего лица?   -  person Andrey    schedule 16.02.2021
comment
Да, я отредактировал вопрос и добавил, как импортировать модели.   -  person mitra mirshafiee    schedule 16.02.2021


Ответы (1)


Вы можете получить вложения с помощью функции get_input_embeddings:

model = build_custome_model():

model.layers[3].get_input_embeddings()(input_ids)
person cronoik    schedule 16.02.2021
comment
Спасибо за ваш комментарий. Проблема в том, что эта модель выводит только 5 меток после точной настройки. Я хочу также иметь возможность получить кодировку (встраивание) предложения, которое я даю ему после его обучения на наборе данных, и получать средние вложения для каждого предложения. Я попытался добавить скрытые состояния к выходным данным tf.Keras.Model, но процесс обучения стал очень медленным. - person mitra mirshafiee; 16.02.2021
comment
Вы хотите, чтобы все скрытые состояния (т.е. вывод из каждого слоя BertEncoder) или только вывод последнего скрытого состояния? @mitramirshafiee - person cronoik; 16.02.2021
comment
Я хочу, чтобы вложения (первый уровень последнего выходного файла модели, который является modelOutput [2] [0] или modelOutput ['' hidden_states ''] [0]) получали среднее значение всех вложений токенов после обучения модели. в наборе данных с 5 метками. - person mitra mirshafiee; 16.02.2021
comment
@mitramirshafiee Извини, что я тебя неправильно понял. Я думаю, что тренировка замедляется, потому что вы заполняете свою оперативную память. Вероятно, вы ищете model.layers[3].get_input_embeddings()(input_ids). Я отредактирую свой вопрос, если это то, что вы ищете. - person cronoik; 16.02.2021
comment
Большое спасибо за ответ. Я все еще не совсем уверен, дает ли эта функция (get_input_embeddings ()) мне вложения модели, которая была точно настроена, потому что результаты сейчас не сильно отличаются от BERT, и я немного обеспокоен этим фактически выводит основные вложения BERT перед обучением. - person mitra mirshafiee; 17.02.2021
comment
Нет, он возвращает фактический слой внедрения (т.е. после обучения). То, что это похоже, просто показывает, что ваши данные не сильно отличаются от данных, используемых для предварительного обучения BERT. @mitramirshafiee - person cronoik; 17.02.2021