Как использовать библиотеку Hugging Face Transformers в Tensorflow для классификации текста на пользовательских данных? - PullRequest
6 голосов
/ 30 января 2020

Я пытаюсь выполнить двоичную классификацию текста для пользовательских данных (в формате csv), используя различные архитектуры трансформаторов, которые предлагает библиотека Hugging Face 'Transformers'. Я использую это сообщение в блоге Tensorflow в качестве ссылки.

Я загружаю пользовательский набор данных в формат 'tf.data.Dataset', используя следующий код:

def get_dataset(file_path, **kwargs):
   dataset = tf.data.experimental.make_csv_dataset(
     file_path,
     batch_size=5, # Artificially small to make examples easier to show.
     na_value="",
     num_epochs=1,
     ignore_errors=True, 
     **kwargs)
   return dataset 

После этого, когда я пытался использовать 'glue_convert_examples_to_features' метод токенизации, как показано ниже:

train_dataset = glue_convert_examples_to_features(
                           examples = train_data,
                           tokenizer = tokenizer, 
                           task = None,
                           label_list = ['0', '1'],
                           max_length = 128
                           )

, который выдает ошибку «UnboundLocalError: локальная переменная« процессор », на которую ссылается перед присваиванием» »:

 if is_tf_dataset:
    example = processor.get_example_from_tensor_dict(example)
    example = processor.tfds_map(example)

Во всех примерах я вижу что они используют такие задачи, как 'mrp c' и c, которые предварительно определены и имеют обработчик glue_processor. Ошибка возникает в «строке 85» в исходном коде .

Может ли кто-нибудь помочь с решением этой проблемы с помощью «пользовательских данных»?

1 Ответ

6 голосов
/ 30 марта 2020

У меня была такая же проблема с запуском.

Это Представление Kaggle мне очень помогло. Там вы можете увидеть, как можно токенизировать данные в соответствии с выбранной предварительно обученной моделью:

def tokenize_sentences(sentences, tokenizer, max_seq_len = 128):
    tokenized_sentences = []

    for sentence in tqdm(sentences):
        tokenized_sentence = tokenizer.encode(
                            sentence,                  # Sentence to encode.
                            add_special_tokens = True, # Add '[CLS]' and '[SEP]'
                            max_length = max_seq_len,  # Truncate all sentences.
                    )

        tokenized_sentences.append(tokenized_sentence)

    return tokenized_sentences

tokenizer = BertTokenizer.from_pretrained(bert_model_name, do_lower_case=True)
train_ids = tokenize_sentences(your_sentence_list, tokenizer)

Кроме того, я посмотрел на источник из glue_convert_examples_to_features. Там вы можете увидеть, как можно создать tf.data.dataset , совместимый с моделью BERT. Я создал для этого функцию:

def create_dataset(ids, masks, labels):
    def gen():
        for i in range(len(train_ids)):
            yield (
                {
                    "input_ids": ids[i],
                    "attention_mask": masks[i]
                },
                labels[i],
            )

    return tf.data.Dataset.from_generator(
        gen,
        ({"input_ids": tf.int32, "attention_mask": tf.int32}, tf.int64),
        (
            {
                "input_ids": tf.TensorShape([None]),
                "attention_mask": tf.TensorShape([None])
            },
            tf.TensorShape([None]),
        ),
    )

train_dataset = create_dataset(train_ids, train_masks, train_labels)

Затем я использую набор данных следующим образом:

from transformers import TFBertForSequenceClassification, BertConfig

model = TFBertForSequenceClassification.from_pretrained(
    bert_model_name, 
    config=BertConfig.from_pretrained(bert_model_name, num_labels=20)
)

# Prepare training: Compile tf.keras model with optimizer, loss and learning rate schedule
optimizer = tf.keras.optimizers.Adam(learning_rate=3e-5, epsilon=1e-08, clipnorm=1.0)
loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
metric = tf.keras.metrics.CategoricalAccuracy('accuracy')
model.compile(optimizer=optimizer, loss=loss, metrics=[metric])

# Train and evaluate using tf.keras.Model.fit()
history = model.fit(train_dataset, epochs=1, steps_per_epoch=115, validation_data=val_dataset, validation_steps=7)
...