MultiSegmentPacker
類別keras_nlp.layers.MultiSegmentPacker(
sequence_length,
start_value,
end_value,
sep_value=None,
pad_value=None,
truncate="round_robin",
**kwargs
)
將多個序列打包成單一固定寬度的模型輸入。
此層將多個輸入序列打包成單一固定寬度的序列,其中包含開始和結束分隔符號,形成適用於 BERT 和類 BERT 模型分類任務的密集輸入。
將一組詞段作為輸入。每個元組元素應包含段落的詞段,以張量、tf.RaggedTensor
或清單的形式傳遞。對於批次輸入,詞段元組中的每個元素應為清單的清單或秩為 2 的張量。對於非批次輸入,每個元素應為清單或秩為 1 的張量。
此層將按以下方式處理輸入:- 根據 truncate
策略截斷所有輸入段以符合 sequence_length
。- 串聯所有輸入段,在整個序列的開頭添加單一 start_value
,並在每個段的結尾添加多個 end_value
。- 使用 pad_tokens
將結果序列填充到 sequence_length
。- 計算「段 ID」的獨立張量,其整數類型和形狀與打包詞段輸出相同,其中每個整數索引表示詞段的來源段。start_value
的段 ID 始終為 0,每個 end_value
的段 ID 為其前面的段。
參數
None
,則使用 end_value
。資料類型必須與傳遞到該層的輸入張量的資料類型相符。"round_robin"
或 "waterfall"
。"round_robin"
:可用空間以循環方式一次分配一個詞彙給仍然需要的輸入,直到達到限制為止。"waterfall"
:預算分配使用「瀑布」演算法完成,該演算法以從左到右的方式分配配額,並填滿儲存桶,直到預算用盡為止。它支援任意數量的區段。傳回值
具有兩個元素的元組。第一個是密集的、打包的詞彙序列。第二個是相同形狀的整數張量,其中包含區段 ID。
範例
打包單一輸入以進行分類。
>>> seq1 = [1, 2, 3, 4]
>>> packer = keras_nlp.layers.MultiSegmentPacker(
... sequence_length=8, start_value=101, end_value=102
... )
>>> token_ids, segment_ids = packer((seq1,))
>>> np.array(token_ids)
array([101, 1, 2, 3, 4, 102, 0, 0], dtype=int32)
>>> np.array(segment_ids)
array([0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
打包多個輸入以進行分類。
>>> seq1 = [1, 2, 3, 4]
>>> seq2 = [11, 12, 13, 14]
>>> packer = keras_nlp.layers.MultiSegmentPacker(
... sequence_length=8, start_value=101, end_value=102
... )
>>> token_ids, segment_ids = packer((seq1, seq2))
>>> np.array(token_ids)
array([101, 1, 2, 3, 102, 11, 12, 102], dtype=int32)
>>> np.array(segment_ids)
array([0, 0, 0, 0, 0, 1, 1, 1], dtype=int32)
使用不同的 sep 詞彙打包多個輸入以進行分類。
>>> seq1 = [1, 2, 3, 4]
>>> seq2 = [11, 12, 13, 14]
>>> packer = keras_nlp.layers.MultiSegmentPacker(
... sequence_length=8,
... start_value=101,
... end_value=102,
... sep_value=[102, 102],
... )
>>> token_ids, segment_ids = packer((seq1, seq2))
>>> np.array(token_ids)
array([101, 1, 2, 102, 102, 11, 12, 102], dtype=int32)
>>> np.array(segment_ids)
array([0, 0, 0, 0, 0, 1, 1, 1], dtype=int32)
參考