KerasHub:预训练模型 / API文档 / 预处理层 / MultiSegmentPacker 层

MultiSegmentPacker layer

[源代码]

MultiSegmentPacker

keras_hub.layers.MultiSegmentPacker(
    sequence_length,
    start_value,
    end_value,
    sep_value=None,
    pad_value=None,
    truncate="round_robin",
    padding_side="right",
    **kwargs
)

将多个序列打包成一个固定宽度的模型输入。

该层将多个输入序列打包成一个单一的、固定宽度的序列,该序列包含开始和结束分隔符,形成一个适合BERT及类似模型分类任务的密集输入。

输入为一个 token 序列的元组。每个元组元素应包含一个序列的 tokens,以张量、tf.RaggedTensor 或列表的形式传入。对于批量输入,序列元组中的每个元素应为列表的列表或秩为二的张量。对于非批量输入,每个元素应为列表或秩为一的张量。

该层将按以下方式处理输入: - 根据 `truncate` 策略,将所有输入序列截断以适应 `sequence_length`。 - 连接所有输入序列,在整个序列的开头添加一个 `start_value`,并在每个序列的末尾添加多个 `end_value`。 - 使用 `pad_tokens` 将生成的序列填充至 `sequence_length`。 - 计算一个独立的“序列 ID”张量,其数据类型为整数,形状与打包后的 token 输出相同,其中每个整数索引表示 token 来自哪个序列。`start_value` 的序列 ID 始终为 0,而每个 `end_value` 的序列 ID 是其前面的序列 ID。

参数

  • sequence_length:int。期望的输出长度。
  • start_value:int/str/list/tuple。放置在每个序列开头的 ID/token(BERT 中称为“[CLS]”)。数据类型必须与输入张量到该层的数据类型匹配。
  • end_value:int/str/list/tuple。放置在最后一个输入序列末尾的 ID/token(BERT 中称为“[SEP]”)。数据类型必须与输入张量到该层的数据类型匹配。
  • sep_value:int/str/list/tuple。放置在除最后一个序列外的所有序列末尾的 ID/token(BERT 中称为“[SEP]”)。如果为 `None`,则使用 `end_value`。数据类型必须与输入张量到该层的数据类型匹配。
  • pad_value:int/str。放置在序列中最后一个序列之后未使用的位置的 ID 或 token(BERT 中称为“[PAD]”)。
  • truncate:str。将批量序列列表截断以适应每个示例长度限制的算法。该值可以是 `"round_robin"` 或 `"waterfall"`。
    • "round_robin":可用空间以循环方式一次分配一个标记给仍需要标记的输入,直到达到限制。
    • ``"waterfall"``:预算分配使用“瀑布”算法,该算法从左到右分配配额,并填充桶直到预算用完。它支持任意数量的序列。
  • padding_side:str。“left”(左侧)或“right”(右侧)填充输入。默认为“right”。

返回

一个包含两个元素的元组。第一个是密集、打包的 token 序列。第二个是相同形状的整数张量,包含序列 ID。

示例

打包单个输入以用于分类。

>>> seq1 = [1, 2, 3, 4]
>>> packer = keras_hub.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_hub.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 token 打包多个输入以用于分类。

>>> seq1 = [1, 2, 3, 4]
>>> seq2 = [11, 12, 13, 14]
>>> packer = keras_hub.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 等人,2018.