对自定义数据集进行多类分类的微调拥抱面DistilBERT在预测时产生奇怪的输出形状

问题描述

我正在按照https://huggingface.co/transformers/custom_datasets.html上的教程,对自定义数据集上的多类别分类(100个类别)的distilbert进行huggingface的实现微调。

我正在使用Tensorflow进行此操作,并在本机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)。

这里发生了什么暗示吗? (很抱歉,如果这很幼稚,我对tensorflow还是陌生的。)

解决方法

我有完全一样的问题。我不知道为什么会发生这种情况,因为通过查看本教程可以找到正确的代码。

但是对我来说,它可以从train_encodings中创建numpy数组,并将其直接传递给fit方法,而不是创建Dataset。

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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...