根据https://huggingface.co/transformers/custom_datasets.html的教程,我正在尝试对huggingface的distilbert实现进行微调,以便在自定义数据集上进行多类分类(100类)。
为此,我使用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个示例)时,该模型似乎为每个令牌产生一个预测,而不是每个序列产生一个预测……
也就是说,我得到的不是shape (1, 2000, 100)的输出,而是shape (1, 1024000, 100)的输出,其中1024000是测试用例的数量(2000) *序列长度(512)。
对这里发生的事情有什么提示吗?(如果这太天真了,我很抱歉,我是tensorflow的新手)。
发布于 2020-10-25 23:16:32
我也有同样的问题。我不知道为什么会发生这种情况,但通过查看教程,它应该是正确的代码。
但对我来说,它的工作原理是在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)https://stackoverflow.com/questions/64500833
复制相似问题