тонкая настройка 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)