基于XLSum微调MT5阿拉伯语抽象摘要模型的张量错误解决
MT5阿拉伯语摘要微调试错:解决张量创建维度错误
错误根源
你触发的ValueError: too many dimensions 'str'和张量创建失败,核心问题有两个:
- 验证集格式不兼容:用
df.apply(convert_examples_to_features___train, axis=1)生成的df_train_pt是pandas Series,每个元素是字典,但Hugging Face的Trainer要求训练/验证集必须是datasets.Dataset类型,而非pandas结构。 - 数据处理逻辑不一致:训练集用批量处理的
map方法,验证集却逐行处理,且两者的文本最大长度设置不同(训练集max_length=520,验证集max_length=1024),导致张量形状无法对齐,进而触发维度错误。
分步解决
1. 统一数据格式:将自定义验证集转为Dataset
把你的pandas验证集DataFrame转换成datasets.Dataset,和训练集保持一致格式:
from datasets import Dataset # 将pandas DataFrame转为Dataset对象 val_dataset = Dataset.from_pandas(df)
2. 统一数据处理函数
删除冗余的convert_examples_to_features___train函数,直接复用训练集的convert_examples_to_features2处理验证集,确保参数完全一致:
# 统一处理逻辑:训练集和验证集用同一个函数、相同参数 def convert_examples_to_features2(example_batch): # 统一文本最大长度为1024,避免信息丢失 input_encodings = tokenizer(example_batch['text'], max_length=1024, truncation=True, padding=True) with tokenizer.as_target_tokenizer(): target_encodings = tokenizer(example_batch['summary'], max_length=128, truncation=True, padding=True) return { 'input_ids': input_encodings['input_ids'], 'attention_mask': input_encodings['attention_mask'], 'labels': target_encodings['input_ids'] } # 批量处理训练集和验证集 datasets_pt = dataset.map(convert_examples_to_features2, batched=True) val_dataset_pt = val_dataset.map(convert_examples_to_features2, batched=True)
3. 修复Trainer初始化参数
将Trainer中的验证集替换为处理好的val_dataset_pt:
trainer = Trainer( model=model, args=trainer_args, train_dataset=datasets_pt["train"], eval_dataset=val_dataset_pt, # 替换为标准Dataset格式的验证集 data_collator=seq2seq_data_collator, tokenizer=tokenizer, )
4. 额外优化:清理冗余代码
- 删除重复加载的
MT5ForConditionalGeneration实例,保留最后一次带to(device)的模型加载逻辑; - 确保训练集和验证集的tokenizer参数完全一致,避免因参数差异导致的张量形状不匹配。
关键修正后的完整代码片段
# 加载自定义验证集并转为Dataset df = pd.read_json("/content/drive/MyDrive/labeled_validation_dataset.jsonl", lines=True, orient='records') val_dataset = Dataset.from_pandas(df) # 统一数据处理函数 def convert_examples_to_features2(example_batch): input_encodings = tokenizer(example_batch['text'], max_length=1024, truncation=True, padding=True) with tokenizer.as_target_tokenizer(): target_encodings = tokenizer(example_batch['summary'], max_length=128, truncation=True, padding=True) return { 'input_ids': input_encodings['input_ids'], 'attention_mask': input_encodings['attention_mask'], 'labels': target_encodings['input_ids'] } # 批量处理训练集和验证集 datasets_pt = dataset.map(convert_examples_to_features2, batched=True) val_dataset_pt = val_dataset.map(convert_examples_to_features2, batched=True) # 初始化Trainer trainer = Trainer( model=model, args=trainer_args, train_dataset=datasets_pt["train"], eval_dataset=val_dataset_pt, data_collator=seq2seq_data_collator, tokenizer=tokenizer, )
内容的提问来源于stack exchange,提问作者SmilyFace
相关产品推荐
相关产品推荐

