趋近智
在使用分词 (tokenization)、整数编码以及可能的嵌入 (embedding)查找等方法将原始序列转换为数值表示,并通过填充和掩码处理确保统一性之后,下一步是将这些处理过的序列分组,形成批次。深度学习 (deep learning)模型通常以数据批次而非单个样本进行训练,这有几个原因:
循环模型的输入数据通常期望为特定的三维张量格式。尽管具体顺序在不同框架(如TensorFlow或PyTorch)中可能略有差异,但常见结构为:
(batch_size, time_steps, num_features)
让我们分解说明:
batch_size: 此批次中包含的序列数量。time_steps: 批次中序列的长度。很重要的一点是,由于填充处理,这个维度将等于该批次中最长序列的长度。所有较短的序列都会被填充到这个长度。num_features: 每个时间步表示的维度。
num_features 将是 1(即整数ID)。num_features 将是嵌入向量 (vector)的维度或每个时间步的输入特征数量。假设您有三个经过整数编码和填充(其中 0 是填充值)的序列:
[10, 25, 31, 0, 0][15, 8, 99, 50, 2][5, 12, 18, 77, 0]如果这些序列形成一个批次(batch_size = 3),time_steps 维度必须适应最长的序列(序列 B,长度 5)。生成的输入批次张量(假设整数ID的num_features = 1)将如下所示:
[
[[10], [25], [31], [ 0], [ 0]], // 序列 A (已填充)
[[15], [ 8], [99], [50], [ 2]], // 序列 B
[[ 5], [12], [18], [77], [ 0]] // 序列 C (已填充)
]
此张量的形状为 。
还记得我们在填充步骤中生成的掩码吗?它们在处理批次时变得非常重要。循环神经网络 (neural network) (RNN)层(以及后续层或损失函数 (loss function))需要知道批次张量中的哪些元素对应真实数据,哪些只是填充。
以上述示例来说,对应的掩码张量将表示真实数据(1)与填充(0):
[
[1, 1, 1, 0, 0], // 序列 A 的掩码
[1, 1, 1, 1, 1], // 序列 B 的掩码
[1, 1, 1, 1, 0] // 序列 C 的掩码
]
这个掩码张量,通常形状为 (批次大小, 时间步),经常与输入批次一同传递给循环神经网络层,或在损失计算中使用。循环神经网络层的框架API通常有特定参数 (parameter)(例如 Keras/TensorFlow 中的 mask,或 PyTorch 中使用 packed sequences 隐式处理)来处理这一点,以确保与填充时间步相关的计算被忽略。
手动创建这些填充后的批次和掩码可能很繁琐。幸运的是,深度学习 (deep learning)框架提供了高级工具来简化此过程:
tf.data.Dataset API 效率很高。您可以创建包含可变长度序列的数据集,然后使用 padded_batch 等方法。此方法会自动将元素分组为批次,确定每个批次中的最大长度,将该批次中的所有序列填充到该长度,并且通常可以隐式处理下游层的掩码。torch.utils.data.Dataset 和 DataLoader 类。您通常定义一个自定义 Dataset 来加载单个序列。DataLoader 处理批处理。要在批次内实现填充,您通常会向 DataLoader 提供一个自定义 collate_fn。此函数接受样本列表(您的序列),并手动填充它们(例如,使用 torch.nn.utils.rnn.pad_sequence)以形成批次张量,并可能生成掩码。以下是根据可变长度序列创建批次的图示:
可变长度序列批处理流程。原始序列在堆叠成批次张量之前,会被填充到组内的最大长度(本例中为5)。相应的掩码标识出原始数据点。
通过正确地对填充和掩码处理后的序列进行批处理,您可以将数据准备成精确的格式,从而高效且有效地训练使用现代深度学习 (deep learning)库的循环神经网络 (neural network) (RNN)。这一步连接了预处理后的单个序列与模型训练循环的输入要求。
这部分内容有帮助吗?
padded_batch 等方法。Dataset 和 DataLoader 进行数据处理,包括自定义 collate_fn 用于批处理和填充变长序列。© 2026 ApX Machine Learning用心打造