求助:RuntimeError: Trying to resize storage that is not resizable报错原因排查
问题分析与解决方案
这个报错RuntimeError: Trying to resize storage that is not resizable出现在PyTorch DataLoader的collate阶段,结合你的场景(仅5秒音频数据集触发、2秒数据集正常、固定在第19个batch报错),核心原因是某个/某些音频样本转换为spectrogram后生成的Tensor使用了不可调整大小的存储,当default_collate尝试自动拼接batch时触发了错误。以下是具体原因排查和解决方法:
可能的触发原因
- Tensor存储不可调整:用
torch.from_numpy()或torch.as_tensor()将librosa等库生成的numpy数组转为Tensor时,如果原numpy数组是只读视图(比如从文件读取时的特殊内存映射),生成的Tensor会共享原数组的不可变存储,无法被resize。5秒音频的spectrogram数据量更大,处理时更容易触发这种情况,而2秒音频的小数据量刚好避开了存储限制。 - 异常音频文件:数据集中可能存在损坏、采样率/声道数不一致的5秒音频,导致生成的spectrogram Tensor存在异常存储属性。即使随机拆分数据,这些异常样本总会被分配到第19个batch(比如数据量刚好让该样本落在第19个batch的固定位置),从而每次都触发报错。
- 多Worker存储冲突:DataLoader的多Worker模式下,可能出现Tensor存储的跨进程共享问题,导致某个Worker中的Tensor存储变为不可调整。2秒音频数据集因为数据量小,Worker处理速度快,未触发该冲突。
解决方法
强制生成可调整存储的Tensor:
在Dataset的__getitem__方法中,将spectrogram Tensor转为拥有独立可调整存储的版本:# 替换原有的torch.from_numpy()或torch.as_tensor() spec = torch.tensor(librosa.feature.melspectrogram(y=audio)) # 或者对已有Tensor克隆 spec = torch.from_numpy(librosa.feature.melspectrogram(y=audio)).clone()确保每个Tensor都有自己的可调整存储,避免default_collate拼接时的resize失败。
排查异常音频样本:
临时将DataLoader的num_workers设为0,运行训练时打印每个batch的样本路径,提取第19个batch的所有样本,单独检查这些音频文件的完整性、采样率、声道数是否统一。对异常文件进行修复或移除。禁用多Worker或自定义collate_fn:
临时将num_workers设为0,若不再报错,说明是多Worker导致的存储冲突。可以尝试升级PyTorch版本,或自定义collate_fn手动处理batch拼接:def custom_collate_fn(batch): processed_batch = [] for item in zip(*batch): if isinstance(item[0], torch.Tensor): # 先将每个Tensor转为可调整的,再拼接 processed = torch.stack([t.clone() for t in item]) processed_batch.append(processed) else: processed_batch.append(item) return tuple(processed_batch)在DataLoader中指定
collate_fn=custom_collate_fn即可。
内容的提问来源于stack exchange,提问作者Jack Of All Trades
相关产品推荐
相关产品推荐

