Datasets 文件
批處理對映
加入 Hugging Face 社群
並獲得增強的文件體驗
開始使用
批處理對映
將 Dataset.map() 的實用性與批處理模式相結合是非常強大的。它能讓您加快處理速度,並自由控制生成資料集的大小。
對速度的追求
批處理對映的主要目標是加快處理速度。通常,處理批次資料比處理單個樣本要快。自然而然地,批處理對映非常適合用於分詞。例如,🤗 Tokenizers 庫在處理批次資料時速度更快,因為它會並行處理批次中的所有樣本的分詞任務。
輸入大小 != 輸出大小
控制生成資料集大小的能力可以用於許多有趣的用例。在“如何操作”對映部分,有一些使用批處理對映的例子:
- 將長句子分割成更短的塊。
- 透過新增額外的詞元(token)來擴充資料集。
瞭解其工作原理有助於您想出自己使用批處理對映的方法。此時,您可能想知道如何控制生成資料集的大小。答案是:對映函式返回的輸出批次大小不必與輸入批次大小相同。
換句話說,您的對映函式輸入可以是一個大小為 `N` 的批次,並返回一個大小為 `M` 的批次。輸出大小 `M` 可以大於或小於 `N`。這意味著您可以連線您的樣本,將其分割,甚至新增更多樣本!
但是,請記住,輸出字典中的所有值必須包含與該輸出字典中其他欄位相同數量的元素。否則,將無法定義對映函式返回的輸出中的樣本數量。這個數量可以在對映函式處理的連續批次之間變化。但是,對於單個批次,輸出字典的所有值應具有相同的長度(即,元素數量)。
例如,對於一個包含1列3行的資料集,如果您使用 `map` 返回一個行數翻倍的新列,那麼您將會遇到錯誤。在這種情況下,您最終會得到一列有3行,另一列有6行。如您所見,表格將是無效的。
>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset.map(lambda batch: {"b": batch["a"] * 2}, batched=True) # new column with 6 elements: [0, 1, 2, 0, 1, 2]
'ArrowInvalid: Column 1 named b expected length 3 but got length 6'
要使其有效,您必須刪除其中一列。
>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset_with_duplicates = dataset.map(lambda batch: {"b": batch["a"] * 2}, remove_columns=["a"], batched=True)
>>> len(dataset_with_duplicates)
6