тонкая настройка huggingface DistilBERT для мультиклассовой классификации в настраиваемом наборе данных дает странную форму вывода при прогнозировании

Я пытаюсь настроить реализацию distilbert в huggingface для классификации нескольких классов (100 классов) в настраиваемом наборе данных, следуя руководству на https://huggingface.co/transformers/custom_datasets.html.

Я делаю это с помощью Tensorflow и тонко настраиваю собственный тензорный поток, то есть я использую следующую часть учебника для создания набора данных:

import tensorflow as tf
train_dataset = tf.data.Dataset.from_tensor_slices((
    dict(train_encodings),
    train_labels
))
val_dataset = tf.data.Dataset.from_tensor_slices((
    dict(val_encodings),
    val_labels
))
test_dataset = tf.data.Dataset.from_tensor_slices((
    dict(test_encodings),
    test_labels
))

А вот этот для тонкой настройки:

from transformers import TFDistilBertForSequenceClassification
model = TFDistilBertForSequenceClassification.from_pretrained('distilbert-base-uncased')
optimizer = tf.keras.optimizers.Adam(learning_rate=5e-5)
model.compile(optimizer=optimizer, loss=model.compute_loss) # can also use any keras loss fn
model.fit(train_dataset.shuffle(1000).batch(16), epochs=3, batch_size=16)

Кажется, что все идет хорошо с тонкой настройкой, но когда я пытаюсь предсказать на тестовом наборе данных, используя model.predict(test_dataset) в качестве аргумента (с 2000 примеров) модель, кажется, дает одно предсказание на токен, а не одно предсказание на последовательность...

То есть вместо вывода формы (1, 2000, 100), Я получаю вывод формы (1, 1024000, 100), где 1024000 - количество тестовых примеров (2000) * длина последовательности (512).

Любой намек на то, что здесь происходит? (Извините, если это наивно, я новичок в тензорном потоке).

1 ответ

У меня была точно такая же проблема. Я не знаю, почему это происходит, так как это должно быть правильным кодом, просмотрев руководство.

Но для меня это помогло создать массивы numpy из train_encodings и передать их непосредственно методу fit вместо создания набора данных.

x1 = np.array(list(dict(train_encodings).values()))[0]
x2 = np.array(list(dict(train_encodings).values()))[1]
model.fit([x1,x2], train_labels, epochs=20)
Другие вопросы по тегам