You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

训练T5模型遇TypeError: 'DataLoader'对象不可下标访问求助

问题排查与解决方案

错误根源

  1. 数据预处理逻辑混乱:使用pd.DataFrame.apply逐行处理后,得到的是包含字典的Series,后续转换为TensorFlow Dataset再套PyTorch DataLoader,数据结构完全不符合要求。
  2. 框架混用冲突:你使用的是PyTorch版本的T5模型,却同时混用了TensorFlow的tf.data.Dataset和PyTorch的DataLoader,两者无法兼容。
  3. Trainer参数类型错误:Trainer的train_dataset和eval_dataset需要传入Dataset对象(Hugging Face Dataset或PyTorch Dataset),而非PyTorch的DataLoader——DataLoader不支持下标访问,这是导致TypeError: 'DataLoader' object is not subscriptable的直接原因。

修正后的完整代码

import numpy as np
import pandas as pd
from transformers import (
    AutoTokenizer, 
    T5ForConditionalGeneration, 
    TrainingArguments, 
    Trainer,
    default_data_collator
)
from datasets import Dataset

# 加载数据集
path = "/content/train_set.csv"
path_val = "/content/dev_set.csv"
path_test = "/content/test_ur.csv"

ds_train = pd.read_csv(path)
ds_val = pd.read_csv(path_val)
ds_test = pd.read_csv(path_test)

# 转换为Hugging Face标准Dataset格式
train_dataset = Dataset.from_pandas(ds_train)
val_dataset = Dataset.from_pandas(ds_val)

# 初始化模型与分词器
model_name = "t5-small"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = T5ForConditionalGeneration.from_pretrained(model_name)

# 数据预处理函数(假设CSV第0列是目标文本,第1列是输入文本,可根据实际列名调整)
def preprocess_function(examples):
    inputs = examples[ds_train.columns[1]]
    targets = examples[ds_train.columns[0]]
    
    # 处理输入文本
    model_inputs = tokenizer(
        inputs, 
        max_length=128, 
        padding="max_length", 
        truncation=True,
        return_tensors="pt"
    )
    # 处理目标文本,T5要求pad token对应label设为-100(避免计算pad的损失)
    labels = tokenizer(
        targets, 
        max_length=128, 
        padding="max_length", 
        truncation=True,
        return_tensors="pt"
    )
    labels["input_ids"] = [[-100 if token == tokenizer.pad_token_id else token for token in seq] for seq in labels["input_ids"]]
    model_inputs["labels"] = labels["input_ids"]
    
    return model_inputs

# 批量预处理数据集(batched=True大幅提升效率)
tokenized_train = train_dataset.map(preprocess_function, batched=True)
tokenized_val = val_dataset.map(preprocess_function, batched=True)

# 训练参数配置
training_args = TrainingArguments(
    output_dir="./log_results",
    num_train_epochs=3,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    warmup_steps=500,
    logging_steps=100,
    evaluation_strategy="epoch",
    save_steps=1000000,
    gradient_accumulation_steps=2,
    weight_decay=0.01,
    logging_dir="./logs",
    remove_unused_columns=False  # 必须设置,防止Trainer自动删除labels列
)

# 定义评估指标(生成任务更推荐用BLEU/ROUGE,此处保留原准确率逻辑并优化)
def compute_metrics(pred):
    labels = pred.label_ids
    preds = pred.predictions.argmax(-1)
    # 忽略-100对应的pad token
    mask = labels != -100
    accuracy = np.mean((preds[mask] == labels[mask]).astype(float))
    return {"accuracy": accuracy}

# 初始化Trainer并开始训练
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_train,
    eval_dataset=tokenized_val,
    compute_metrics=compute_metrics,
    data_collator=default_data_collator,
)

trainer.train()

关键修改说明

  1. 改用Hugging Face Dataset:用Dataset.from_pandas将DataFrame转为标准Dataset,配合map函数批量预处理,数据结构更规范,效率更高。
  2. 修复标签处理逻辑:T5模型要求将pad token对应的label设为-100,避免计算pad部分的损失,这是生成任务的标准处理方式。
  3. 移除框架混用代码:删除所有TensorFlow相关代码和PyTorch DataLoader,直接将预处理后的Dataset传给Trainer,Trainer会自动完成批加载逻辑。
  4. 优化评估指标:将原TensorFlow依赖的准确率计算改为纯NumPy实现,同时忽略pad token的影响,结果更准确。
  5. 添加必要参数:在TrainingArguments中设置remove_unused_columns=False,防止Trainer自动删除labels列导致训练失败。

内容的提问来源于stack exchange,提问作者MarMarhoun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:55:00