MultiSegmentPacker
类keras_hub.layers.MultiSegmentPacker(
sequence_length,
start_value,
end_value,
sep_value=None,
pad_value=None,
truncate="round_robin",
**kwargs
)
将多个序列打包成一个固定宽度的模型输入。
此层将多个输入序列打包成一个包含起始和结束分隔符的固定宽度序列,形成适用于 BERT 和类似 BERT 模型的分类任务的密集输入。
接受一个由令牌段组成的元组作为输入。元组的每个元素应包含一个段的令牌,以张量、tf.RaggedTensor
或列表的形式传递。对于批处理输入,段元组中的每个元素应为列表的列表或秩为二的张量。对于非批处理输入,每个元素应为列表或秩为一的张量。
该层将按如下方式处理输入: - 根据 truncate
策略将所有输入段截断以适应 sequence_length
。 - 连接所有输入段,在整个序列的开头添加一个 start_value
,并在每个段的末尾添加多个 end_value
。 - 使用 pad_tokens
将结果序列填充到 sequence_length
。 - 计算一个单独的“段 ID”张量,其类型为整数,形状与打包后的令牌输出相同,其中每个整数索引表示令牌来自哪个段。start_value
的段 ID 始终为 0,每个 end_value
的段 ID 是其前面的段的 ID。
参数
None
,则使用 end_value
。其 dtype 必须与层的输入张量的 dtype 匹配。"round_robin"
或 "waterfall"
"round_robin"
:可用空间以轮循方式一次分配一个令牌给仍需要令牌的输入,直到达到限制。"waterfall"
:预算分配使用“瀑布”算法完成,该算法以从左到右的方式分配配额,并填充存储桶直到预算用尽。它支持任意数量的段。返回值
一个包含两个元素的元组。第一个是密集的、打包的令牌序列。第二个是具有相同形状的整数张量,包含段 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 令牌。
>>> 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)
参考