填充和截断
批量输入的长度通常不同,因此它们不能转换为固定大小的张量。填充和截断是处理这个问题的策略,用于从不同长度的批次中创建矩形张量。填充添加了一个特殊的填充标记,以确保较短的序列将与批次中最长的序列或模型接受的最大长度相同。截断则通过截断长序列来在另一个方向上工作。
在大多数情况下,将批次填充到最长序列的长度并截断到模型可以接受的最大长度效果相当好。然而,如果您需要,API支持更多策略。您需要了解的三个参数是:padding
、truncation
和 max_length
。
padding
参数控制填充。它可以是布尔值或字符串:
True
或'longest'
:填充到批次中最长的序列(如果只提供一个序列,则不应用填充)。'max_length'
: 填充到由max_length
参数指定的长度,如果没有提供max_length
,则填充到模型接受的最大长度(max_length=None
)。即使只提供一个序列,仍然会应用填充。False
或'do_not_pad'
:不应用填充。这是默认行为。
truncation
参数控制截断。它可以是布尔值或字符串:
True
或'longest_first'
:截断到由max_length
参数指定的最大长度,或者如果未提供max_length
(max_length=None
),则截断到模型接受的最大长度。这将逐个标记进行截断,从对中最长的序列中移除一个标记,直到达到适当的长度。'only_second'
: 截断到由max_length
参数指定的最大长度,如果没有提供max_length
,则截断到模型接受的最大长度(max_length=None
)。如果提供了一对序列(或一批序列对),这将只截断这对序列中的第二个句子。'only_first'
: 截断到由max_length
参数指定的最大长度,如果没有提供max_length
,则截断到模型接受的最大长度(max_length=None
)。如果提供了一对序列(或一批序列对),这将只截断第一句话。False
或'do_not_truncate'
:不应用截断。这是默认行为。
max_length
参数控制填充和截断的长度。它可以是一个整数或 None
,在这种情况下,它将默认为模型可以接受的最大长度。如果模型没有特定的最大输入长度,则不会对 max_length
进行截断或填充。
下表总结了推荐的设置填充和截断的方式。如果您在以下任何示例中使用输入序列对,您可以将truncation=True
替换为在['only_first', 'only_second', 'longest_first']
中选择的STRATEGY
,即truncation='only_second'
或truncation='longest_first'
,以控制如何截断对中的两个序列,如前所述。
截断 | 填充 | 指令 |
---|---|---|
不截断 | 不填充 | tokenizer(batch_sentences) |
在批次中对最大序列进行填充 | tokenizer(batch_sentences, padding=True) 或 | |
tokenizer(batch_sentences, padding='longest') | ||
填充到最大模型输入长度 | tokenizer(batch_sentences, padding='max_length') | |
填充到特定长度 | tokenizer(batch_sentences, padding='max_length', max_length=42) | |
填充到某个值的倍数 | tokenizer(batch_sentences, padding=True, pad_to_multiple_of=8) | |
截断到最大模型输入长度 | 无填充 | tokenizer(batch_sentences, truncation=True) 或 |
tokenizer(batch_sentences, truncation=STRATEGY) | ||
在批次中对最大序列进行填充 | tokenizer(batch_sentences, padding=True, truncation=True) 或 | |
tokenizer(batch_sentences, padding=True, truncation=STRATEGY) | ||
填充到最大模型输入长度 | tokenizer(batch_sentences, padding='max_length', truncation=True) 或 | |
tokenizer(batch_sentences, padding='max_length', truncation=STRATEGY) | ||
填充到特定长度 | 不可能 | |
截断到特定长度 | 无填充 | tokenizer(batch_sentences, truncation=True, max_length=42) 或 |
tokenizer(batch_sentences, truncation=STRATEGY, max_length=42) | ||
填充到批次中的最大序列 | tokenizer(batch_sentences, padding=True, truncation=True, max_length=42) 或 | |
tokenizer(batch_sentences, padding=True, truncation=STRATEGY, max_length=42) | ||
填充到最大模型输入长度 | 不可能 | |
填充到特定长度 | tokenizer(batch_sentences, padding='max_length', truncation=True, max_length=42) 或 | |
tokenizer(batch_sentences, padding='max_length', truncation=STRATEGY, max_length=42) |