Keras 3 API 文件 / KerasNLP / 預處理層 / MultiSegmentPacker 層

MultiSegmentPacker 層

[來源]

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 為其前面的段。

參數

  • sequence_length:整數。所需的輸出長度。
  • start_value:整數/字串/清單/元組。要放置在每個序列開頭的 ID 或詞段(BERT 中稱為「[CLS]」)。資料類型必須與傳遞至此層的輸入張量的資料類型相符。
  • end_value:整數/字串/清單/元組。要放置在最後一個輸入段結尾的 ID 或詞段(BERT 中稱為「[SEP]」)。資料類型必須與傳遞至此層的輸入張量的資料類型相符。
  • sep_value:int/str/list/tuple。要在每個區段末尾放置的 ID 或詞彙,最後一個區段除外(對於 BERT 稱為 "[SEP]")。如果為 None,則使用 end_value。資料類型必須與傳遞到該層的輸入張量的資料類型相符。
  • pad_value:int/str。要在序列中最後一個區段之後的未使用位置放置的 ID 或詞彙(對於 BERT 稱為 "[PAD]")。
  • truncate:str。用於截斷批次區段列表以符合每個範例長度限制的演算法。值可以是 "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)

參考

Devlin et al., 2018.