基于PyTorch微调T5-small(XSum数据集)时栈尺寸错误的解决方法
解决RuntimeError: stack expects each tensor to be equal size问题
这个错误的核心原因是训练循环中尝试堆叠(stack)长度不一致的张量,通常是因为输入/输出序列未做统一padding,导致同一个batch内的样本维度不匹配。以下是具体解决步骤:
1. 用Seq2Seq专用数据整理器自动处理padding
直接使用Hugging Face的DataCollatorForSeq2Seq,它会自动对batch内的输入、标签做padding,同时将标签的padding部分设为-100(T5损失函数会忽略该值,避免无效计算)。
from transformers import AutoTokenizer, DataCollatorForSeq2Seq from torch.utils.data import DataLoader # 初始化tokenizer和数据整理器 tokenizer = AutoTokenizer.from_pretrained("t5-small") data_collator = DataCollatorForSeq2Seq( tokenizer=tokenizer, model="t5-small", padding=True, return_tensors="pt" ) # 加载数据集时传入collate_fn train_dataloader = DataLoader( train_dataset, batch_size=8, shuffle=True, collate_fn=data_collator )
2. 手动实现数据整理逻辑(若需自定义)
如果不想用现成的collator,手动处理batch时必须确保所有张量维度一致:
def custom_collate_fn(batch): # 提取batch内的输入和标签序列 input_ids_list = [item["input_ids"] for item in batch] labels_list = [item["labels"] for item in batch] # 对输入序列做padding,统一到batch内最大长度 padded_inputs = tokenizer.pad( {"input_ids": input_ids_list}, padding=True, return_tensors="pt" ) # 对标签序列做padding,并用-100替换pad_token(避免计入损失) padded_labels = tokenizer.pad( {"input_ids": labels_list}, padding=True, return_tensors="pt" )["input_ids"] padded_labels[padded_labels == tokenizer.pad_token_id] = -100 return { "input_ids": padded_inputs["input_ids"], "attention_mask": padded_inputs["attention_mask"], "labels": padded_labels } # 加载数据集时使用自定义整理器 train_dataloader = DataLoader( train_dataset, batch_size=8, shuffle=True, collate_fn=custom_collate_fn )
3. 检查训练循环中的张量操作
- 确保传入模型的
input_ids、attention_mask、labels均为[batch_size, seq_len]形状的张量; - 排查代码中是否存在手动调用
torch.stack()的场景,若有,需先对张量做padding再堆叠,或改用torch.cat()(适用于维度拼接的场景)。
内容的提问来源于stack exchange,提问作者celsowm
相关产品推荐
相关产品推荐

