问题描述
我正在按照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)