参考this colab notebook(来自Huggingface Transformer课程here),如果我运行
tokenized_datasets["train"][:8]
dtype
是dict
而不是Dataset
,并且切片将返回一些数据。如果我在这里传递切片,我会得到一个Key错误,我假设这与我不再传递数据集的事实有关。
from transformers import Trainer
trainer = Trainer(
model,
training_args,
train_dataset=tokenized_datasets["train"][:8],
eval_dataset=tokenized_datasets["validation"],
#data_collator=data_collator,
tokenizer=tokenizer,
)
trainer.train()
***** Running training *****
Num examples = 7
Num Epochs = 3
Instantaneous batch size per device = 8
Total train batch size (w. parallel, distributed & accumulation) = 8
Gradient Accumulation steps = 1
Total optimization steps = 3
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-20-3435b262f1ae> in <module>()
----> 1 trainer.train()
有没有一种简单的方法可以只传递Dataset行的一个子集来进行训练或验证?
3条答案
按热度按时间vhipe2zx1#
产出:
然后我们可以对部分数据集进行采样:
得到以下结果:
来源:https://github.com/huggingface/notebooks/blob/master/transformers_doc/training.ipynb
rhfm7lfc2#
您可以尝试从
torch
使用Subset
,如:这应该为您提供给予一个数据集的子集,因此您仍然满足接口要求。(如果HuggingFace的变形金刚遵循它,我认为他们会这样做。
hkmswyz63#
也有可能进行分片:
其中
dataset.shard()
是就地操作,index是你希望它返回的分片索引。它确实在幕后使用了.select()
来实现这一点。例如,如果你的数据集有1000个元素,而你只想得到其中的
100
个元素,通过将它分片成10个(1000 // 10) = 100
,你将得到每个分片100
个元素。