Добавьте дополнительные слои к трансформаторам Huggingface - PullRequest
0 голосов
/ 01 августа 2020

Я хочу добавить дополнительный слой Dense после предварительно обученных моделей TFDistilBertModel, TFXLNetModel и TFRobertaModel Huggingface. Я уже видел, как я могу это сделать с помощью TFBertModel, например в этом блокноте :

output = bert_model([input_ids,attention_masks])
output = output[1]
output = tf.keras.layers.Dense(32,activation='relu')(output)

Итак, здесь мне нужно использовать второй элемент (т.е. элемент с индексом 1) выходного кортежа BERT. Согласно docs, TFBertModel имеет pooler_output в этом индексе кортежа. Но в трех других моделях нет pooler_output.

Итак, как я могу добавить дополнительные слои к выходным данным трех других моделей?

1 Ответ

0 голосов
/ 01 сентября 2020

Похоже, что pooler_output - это Roberta и Bert специфический c вывод.

Но вместо использования pooler_output мы можем использовать несколько hidden_states (так что не только последнее скрытое состояние) со всеми моделями, мы хотим использовать их, потому что документы сообщают , что hidden_states может дать большую точность, чем только одна last_hidden_state.

# Import the needed model(Bert, Roberta or DistilBert) with output_hidden_states=True
transformer_model = TFBertForSequenceClassification.from_pretrained('bert-large-cased', output_hidden_states=True)

input_ids = tf.keras.Input(shape=(128, ),dtype='int32')
attention_mask = tf.keras.Input(shape=(128, ), dtype='int32')

transformer = transformer_model([input_ids, attention_mask])    
hidden_states = transformer[1] # get output_hidden_states

hidden_states_size = 4 # count of the last states 
hiddes_states_ind = list(range(-hidden_states_size, 0, 1))

selected_hiddes_states = tf.keras.layers.concatenate(tuple([hidden_states[i] for i in hiddes_states_ind]))

# Now we can use selected_hiddes_states as we want
output = tf.keras.layers.Dense(128, activation='relu')(selected_hiddes_states)
output = tf.keras.layers.Dense(1, activation='sigmoid')(output)
model = tf.keras.models.Model(inputs = [input_ids, attention_mask], outputs = output)
model.compile(tf.keras.optimizers.Adam(lr=1e-4), loss='binary_crossentropy', metrics=['accuracy'])
...