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

PyTorch DataLoader加载自定义数据集无响应问题排查

问题:PyTorch DataLoader加载伊辛模型数据集无响应

我是PyTorch新手,需将存储在DataFrame中的2D伊辛模型模拟数据集适配PyTorch卷积神经网络。数据集包含一列28×28 int32数组格式的图片(像素值仅为+1和-1),以及一列类别标签。

已完成以下操作:

  • 导入了必要的库
  • 自定义了MetropolisDataset类
  • 创建数据集实例时可正常读取并显示图片

但使用DataLoader加载后,无论运行CNN还是调用图片显示代码,程序都无响应,既无报错也无计算进展。


问题排查与解决方案

1. 多进程加载冲突

DataLoader设置了num_workers=3,多进程在Windows、Jupyter Notebook等环境下容易出现卡死问题,尤其是数据加载逻辑存在潜在问题时。

解决方法:
先改用单进程测试,将num_workers设为0:

train_dl = DataLoader(train_set, batch_size, shuffle=True, num_workers=0, pin_memory=True)
validation_dl = DataLoader(validation_set, batch_size, shuffle=True, num_workers=0, pin_memory=True)
test_dl = DataLoader(test_set, batch_size, shuffle=True, num_workers=0, pin_memory=True)

若单进程正常运行,再逐步调整num_workers,同时注意:

  • 确保自定义Dataset代码不依赖全局变量或无法序列化的对象
  • Windows环境下,需将DataLoader相关代码放在if __name__ == '__main__':代码块中执行

2. 图片数据格式不兼容

像素值为±1的int32数组直接传给T.ToPILImage()可能存在隐式格式问题,导致后续处理卡住。ToPILImage要求输入为uint8类型或[0,1]范围的float32类型。

解决方法:修改MetropolisDataset的__getitem__方法,提前转换数据格式:

def __getitem__(self, idx):
    if torch.is_tensor(idx):
        idx = idx.tolist()
    label = self.data_frame['label'].iloc[idx]
    image = self.data_frame['image'].iloc[idx]
    
    # 方案1:转换为[0,1]范围的float32
    image = np.array(image, dtype=np.float32)
    image = (image + 1) / 2  # 将-1映射到0,+1映射到1
    
    # 方案2:转换为uint8类型(0和255)
    # image = np.array(image, dtype=np.int32)
    # image = ((image + 1) * 127.5).astype(np.uint8)
    
    if self.transform:
        image = self.transform(image)
    return (image, label)

3. 迭代DataLoader时的元组解析错误

show_batch函数中直接遍历DataLoader时,未正确接收(image_batch, label_batch)的元组,导致后续处理出错(多进程环境下无报错提示)。

解决方法:修改show_batch函数:

def show_batch(dl, nmax=64):
    for images, labels in dl:  # 正确接收图片和标签元组
        show_images(images, nmax)
        break

4. 数据读取效率低下

若DataFrame的image列存储的是Python列表而非numpy数组,每次np.array(image)转换会大幅拖慢加载速度,导致程序无响应。

解决方法:提前预处理DataFrame,将图片列转换为numpy数组:

# 预处理训练、验证、测试集的图片列
df_train['image'] = df_train['image'].apply(lambda x: np.array(x, dtype=np.float32))
df_validation['image'] = df_validation['image'].apply(lambda x: np.array(x, dtype=np.float32))
df_test['image'] = df_test['image'].apply(lambda x: np.array(x, dtype=np.float32))

5. Pin Memory适配问题

pin_memory=True在内存不足或数据格式不匹配时,可能导致卡住。

解决方法:暂时关闭pin_memory测试:

train_dl = DataLoader(train_set, batch_size, shuffle=True, num_workers=0, pin_memory=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:05:18