首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对自定义数据集进行多类分类的微调huggingface DistilBERT在预测时产生奇怪的输出形状

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

Stack Overflow用户
提问于 2020-10-23 21:20:49
回答 1查看 678关注 0票数 0

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

为此,我使用Tensorflow,并在原生tensorflow中进行微调,也就是说,我使用教程的以下部分来创建数据集:

代码语言:javascript
复制
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
))

这一条用于微调:

代码语言:javascript
复制
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的新手)。

EN

回答 1

Stack Overflow用户

发布于 2020-10-25 23:16:32

我也有同样的问题。我不知道为什么会发生这种情况,但通过查看教程,它应该是正确的代码。

但对我来说,它的工作原理是在train_encodings之外创建numpy数组,并将它们直接传递给fit方法,而不是创建Dataset。

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64500833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档