'DataLoader' object is not subscriptable:Subset 要包 Dataset,不要包 loader

简介: 该文详解PyTorch中`Subset`误传`DataLoader`导致`TypeError: 'DataLoader' object is not subscriptable`的典型错误。强调**Dataset负责索引,DataLoader仅负责批处理**,须在可索引的数据集(如`train1`)上划分子集,再构建DataLoader,确保索引空间清晰、划分可控、内存高效。(239字)

原帖把 train_dl 传给 Subset,后续 Subset.getitem 又试图执行 self.dataset[index]:

TypeError: 'DataLoader' object is not subscriptable

数据集负责索引,loader 负责取批次

原题错误是 Subset 内部试图索引传入的 DataLoader。把随机划分放在可索引的 train1 上,再创建 loader,能保留清楚的样本索引空间。不要仅将 loader[0] 改成 next 就跳过原划分逻辑。

DataLoader 是批次迭代器,没有普通样本索引接口。Subset 保存的对象应是可索引数据集,而不是已经组批的 loader。

先在创建 Subset 前确认类型:

print("josh050608")
print("train1:", type(train1), "length:", len(train1))
print("train_dl:", type(train_dl), "dataset:", type(train_dl.dataset))

原题 get_splits() 已返回 train1、test1,应在 train1 的索引空间里再划分验证集。下面 val_count 是明确的验证样本数,不是比例:

import torch
from torch.utils.data import Subset, DataLoader
val_count = 100  # 按自己的样本数修改
assert 0 < val_count < len(train1)
indices = torch.randperm(len(train1)).tolist()
train_subset = Subset(train1, indices[:-val_count])
valid_subset = Subset(train1, indices[-val_count:])
train_dl = DataLoader(train_subset, batch_size=32, shuffle=True)
valid_dl = DataLoader(valid_subset, batch_size=32, shuffle=False)

不要从原始全集生成索引,再拿来索引已划分的 train1;也不要为验证集另建一个内容或顺序可能不同的 Owndata 对象。训练函数究竟接收 Dataset 还是 DataLoader,也应保持一致。

原帖的 np.asarray(list(loader)) 会一次性读取并保留全部 batch,通常没必要。正常训练直接遍历 loader,避免额外内存占用和不规则数组转换。

验证 train_subset[0] 返回单样本、next(iter(train_dl)) 返回批次,并检查训练/验证索引不重叠且覆盖预期训练划分。

用固定种子验证划分不重叠

下面合成 12 条样本,先在 Dataset 上划分,再分别组批,验证训练和验证样本 ID:

import torch
from torch.utils.data import TensorDataset, Subset, DataLoader
dataset = TensorDataset(torch.arange(12), torch.arange(12) % 2)
generator = torch.Generator().manual_seed(87)
indices = torch.randperm(len(dataset), generator=generator).tolist()
train_ids, valid_ids = indices[:9], indices[9:]
assert set(train_ids).isdisjoint(valid_ids)
assert set(train_ids) | set(valid_ids) == set(range(12))
train_subset = Subset(dataset, train_ids)
valid_subset = Subset(dataset, valid_ids)
train_loader = DataLoader(train_subset, batch_size=4, shuffle=True)
valid_loader = DataLoader(valid_subset, batch_size=4, shuffle=False)
assert len(train_subset) == 9 and len(train_loader) == 3
seen = [int(item) for batch, _ in valid_loader for item in batch]
assert seen == valid_ids
print("sample/batch counts:", len(train_subset), len(train_loader))

len(loader) 是批次数,len(dataset) 是样本数。把批次数当作索引上界生成划分,会漏掉大量样本;对已经划分的 train1 再划验证集时,必须使用 train1 的局部索引空间。

训练函数若约定接收 Dataset,就在函数内统一创建 loader;若接收 loader,就直接遍历,避免二次包装。原题 np.asarray(list(loader)) 会提前读取所有批次,可能产生不规则数组与额外内存占用,应按真实后续需求决定是否保留。

验收 subset 单项、loader 首批和划分覆盖范围,再运行小训练 step。若数据有同一患者或同一序列多条记录,还要按任务分组划分,普通随机样本不重叠未必足以避免语义泄漏。

参考:原始求助帖;技术依据:PyTorch 数据加载(2.5)。

相关文章
|
2天前
|
PyTorch 算法框架/工具 索引
TypeError: vars() argument must have dict attribute:Trainer 需要与 forward 对齐的批次字典
该问题源于将含7个张量的`TensorDataset`(tuple结构)直接传给Hugging Face `Trainer`,而其`data_collator`默认要求字典格式以支持`vars()`解析,导致`TypeError`。关键在于:**样本结构必须与模型`forward`签名严格匹配**——需自定义`data_collator`将tuple转为键名正确的字典,并确保字段名、形状、dtype均符合模型输入要求。(239字)
|
2天前
阿里云盘企业版支持对用户数或存储量进行单独扩容了
阿里云盘企业版套餐购买时为固定规格组合;购买后可单独扩容用户数(8元/人/月,起购10人)或存储量(153元/TB/月,起购1TB),无需整体升级。是否升级需比价决策。
65 1
阿里云盘企业版支持对用户数或存储量进行单独扩容了
|
2天前
|
运维 监控 安全
灾害警报邮件服务被入侵后的钓鱼风险传导与治理
2026年10月,日本Arcadia公司灾害警报服务SpeeCAN RAIDEN遭入侵,攻击者利用目录遍历漏洞获取密钥,植入后门发出超142万封仿冒邮件,其中87万封投向非登记地址。事件凸显可信发送通道被复用、机器凭据未轮换、预警真实性受损三大公共安全风险,揭示邮件认证机制在自有服务器被控时的结构性失效。(239字)
28 2
|
2天前
|
弹性计算 人工智能 双11
2026阿里云双11新客专享优惠攻略:轻量应用服务器、ECS、GPU云服务器大促福利一览
综合来看,2026 年阿里云双十一这套覆盖阿里云大模型服务平台、阿里云轻量应用服务器、阿里云 ECS 云服务器、阿里云 GPU 云服务器的全链路福利组合,给新手提供了 38 元极低门槛的上云渠道,给企业客户准备了丰厚的券包补贴,覆盖建站、业务部署、AI 开发等主流场景。 新手可以优先蹲守阿里云轻量应用服务器 38 元秒杀,企业用户领取大额券包搭配阿里云 ECS 云服务器、阿里云 GPU 云服务器、阿里云大模型服务平台采购,老用户抓住续费同价锁定长期成本。活动 11 月 30 日收官在即,窗口不等人——现在就去阿里云官网活动会场,开启你的云上征途吧!
44 1
|
2天前
|
人工智能 弹性计算 双11
2026年阿里云双11新手必看,活动地址入口+活动内容全解析
阿里云双十一已经正式开启,本次大促以“智惠就在11.11,AI就用阿里云”为主题,是全年 轻量应用服务器、ECS 云服务器、GPU 云服务器、百炼大模型服务平台 、云数据库、OSS 对象存储、无影云电脑 、阿里云免费试用 采购性价比最高的节点。
32 0
|
2天前
|
人工智能 并行计算 异构计算
手把手教你:torch.cuda.is_available() 一直是 False?一条命令定位断点|AI工程师踩坑实录·第2篇
GPU用不上别急着重装驱动。本文给出三层断点定位法,按概率排序排查:最常见是框架层装了+cpu轮子,最隐蔽是CUDA_VISIBLE_DEVICES被设成-1(零报错让GPU凭空消失),驱动层放最后。一条cuda_doctor命令即可定断点在哪层。
手把手教你:torch.cuda.is_available() 一直是 False?一条命令定位断点|AI工程师踩坑实录·第2篇
|
2天前
|
监控 BI
外设外带的检测与溯源:三类日志的字段设计与联合分析
本文从检测与溯源视角,解析终端外设日志的三大核心:U盘插拔日志(识介质)、USB文件操作日志(定行为)、刻录日志(补盲区)。强调日志字段设计决定溯源成败——序列号实现跨终端追踪,源/目的路径构成外带证据链,“附件”支持离线核查。三类日志联合分析,可将复盘耗时从数天压缩至小时级。(239字)
|
2天前
|
机器学习/深度学习 存储 人工智能
央广下场做GEO,企业自营Geo优化还有效吗?
本文剖析央广总台“国家队下场”做GEO的实质:非替代企业优化,而是抬升“可信事实资产”标准。专家于磊指出,变化在于参照系从“曝光量”转向“可核验性”,信源需自证+交叉验证,合规成硬门槛。企业应聚焦理清事实库、补全出处、清理存量、重建基线——题没换,分数线动了。
35 0
|
2天前
|
人工智能 自然语言处理 机器人
拒绝功能堆砌:智能客服系统哪家好要看场景适配度与真实投产比
选智能客服,别只看功能多寡,关键在“当下能否闭环”和“三年总账能否算平”。本文以阿里云瓴羊Quick Service为例,提出从场景适配度(接口、确定性、风险、知识)出发,结合真实投产比(人力节省+业务增益−全周期成本)的评估框架,助企业从“买功能”转向“买结果”。
|
2天前
|
弹性计算 人工智能 测试技术
阿里云双十一活动最便宜云服务器多少钱?轻量云服务器38元抢购,云服务器99元和199元续费同价
本文梳理2026年阿里云双十一2核2G入门档的三款云服务器:38元轻量应用服务器,限无订单记录的实名新用户抢购,每天10点、15点限量放货,首年特惠、续费恢复原价;99元ECS经济型e实例,新老用户同享、无需抢购、续费同价,活动至2029年3月31日;199元续费同价档,配置更高、余量更足。文中还给出选购策略与适用场景,以及通用算力型u2i三折起、九代实例6.4折起等更高配置优惠和下单提醒。

热门文章

最新文章