使用Hugging Face训练T5模型时遇RuntimeError:张量尺寸不匹配
解决T5-small训练时的RuntimeError:张量大小不一致问题
问题现象
训练基于Hugging Face的T5-small模型进行乌尔都语到英语的翻译任务时,触发以下错误:
RuntimeError: stack expects each tensor to be equal size, but got [91] at entry 0 and [23] at entry 1
问题原因
预处理阶段未对输入文本和标签文本执行**填充(padding)**操作。当使用batched=True调用map函数时,同批次内的样本长度各不相同,无法堆叠成形状统一的张量,进而导致训练时的stack操作失败。
解决方案
1. 修改预处理函数,添加填充与标签处理
更新preprocess_function,在tokenizer调用时加入填充参数,并将标签中的填充token替换为-100(T5模型会忽略-100标签的损失计算):
def preprocess_function(examples): # 对输入和标签执行截断+填充,统一长度为128(可根据任务调整) inputs = tokenizer(examples['Urdu'], truncation=True, padding='max_length', max_length=128) labels = tokenizer(examples['English'], truncation=True, padding='max_length', max_length=128) # 将标签中的pad token替换为-100,避免计算无效损失 labels["input_ids"] = [ [-100 if token == tokenizer.pad_token_id else token for token in label] for label in labels["input_ids"] ] inputs['labels'] = labels['input_ids'] return inputs
2. 调整数据集格式设置的顺序
将datasets.set_format的调用移至预处理完成之后,确保预处理后的张量已经是统一长度:
# 先执行预处理 datasets = datasets.map(preprocess_function, batched=True) # 再设置数据集为torch格式,指定需要的列 datasets.set_format(type="torch", columns=["input_ids", "attention_mask", "labels"])
3. 可选:验证处理后的张量形状
可以添加以下代码验证处理后的样本形状是否一致:
print("输入张量形状:", datasets['train'][0]['input_ids'].shape) print("标签张量形状:", datasets['train'][0]['labels'].shape)
正常情况下,两者形状应完全相同(例如均为torch.Size([128]))。
核心逻辑总结
通过填充操作强制同批次样本长度统一,同时正确处理标签中的填充位置,避免无效损失计算,即可解决张量堆叠失败的问题。
内容的提问来源于stack exchange,提问作者MarMarhoun
相关产品推荐
相关产品推荐

