报错:ValueError: num_samples should be a positive integer value, but got num_samp=0

此博客为个人记录,提及两个要点。一是设置shuffle=False可解决某些问题;二是数据读取不进,最可能原因是路径错误。

自己记录用的:
1/shuffle=False就可以了
2/最有可能:路径错了,读不进数据

<think>我们正在解决在Windows上复现EDSR-PyTorch项目时出现的错误:ValueError: num_samples should be a positive integer value, but got num_samples=0。 根据错误信息,这个错误通常发生在PyTorch的DataLoader中,当传入的数据集长度为0时。也就是说,程序试图从一个空的数据集中加载数据。 结合引用[1]和引用[2]的提示,以及EDSR-PyTorch项目的实际情况,我们可以从以下几个方面排查: 1. **数据集路径问题**:这是最常见的原因。请确保数据集(DIV2K)已经正确下载并放置在项目指定的目录下,并且在配置文件中正确设置了路径。在Windows系统中,路径分隔符使用反斜杠,但在Python字符串中需要转义(即双反斜杠`\\`)或使用原始字符串(`r"path\to\data"`)。 2. **数据集加载逻辑问题**:引用[2]提到了一个与数据预处理相关的问题,即当`multi=False`时,由于整除问题可能导致图像尺寸不匹配,进而可能影响数据加载。但这里更直接的问题是数据集为空,所以首先应检查数据集是否正确加载。 3. **数据集的划分问题**:项目代码中可能将数据集划分为训练集和验证集,如果划分后的训练集或验证集大小为0,则会出现该错误。需要检查数据集划分的代码。 4. **数据集读取的代码问题**:检查数据集的读取代码(通常位于`src/data/__init__.py`或类似位置)是否正确,是否因为某些条件过滤掉了所有样本。 具体解决步骤: **步骤1:检查数据集路径和内容** - 确认数据集已经下载并解压到正确的目录(默认为`src/data/DIV2K`)。 - 检查该目录下是否有图像文件(通常有训练集和验证集两个子目录,如`DIV2K_train_HR`和`DIV2K_valid_HR`)。 - 在`option.py`中,检查`dir_data`的路径设置是否正确指向DIV2K的父目录(例如,数据集的路径应为`[dir_data]/DIV2K`,其中`dir_data`在默认配置中为`'./src/data'`)。 **步骤2:检查数据集加载代码** - 打开`src/data/div2k.py`(或类似的数据集加载文件),检查数据集加载时是否因为路径错误而返回了空列表。 - 可以在数据集加载代码中添加打印语句,检查实际加载的图像数量。 **步骤3:检查数据划分** - 在训练脚本中,通常会根据训练集和验证集划分数据集。如果验证集比例设置过大(比如1.0)或者训练集比例设置过小(比如0.0),可能导致训练集为空。检查训练脚本中关于数据集划分的参数(如`split`参数)是否合理。 **步骤4:检查数据预处理** - 引用[2]中提到的问题是关于图像尺寸的:当`multi=False`时,由于缩放比例导致图像尺寸无法整除,可能会在裁剪时出现问题。但这个问题通常会导致尺寸不匹配的错误,而不是数据集为空。不过,如果数据预处理过程中因为尺寸问题过滤掉了所有样本,也可能导致此错误。因此,可以尝试: - 将`multi`参数设置为`True`(多尺度训练)以避免尺寸问题。 - 或者调整`patch_size`使其与缩放比例(`scale`)兼容,确保`patch_size`能够被`scale`整除(对于单尺度训练)。 **步骤5:修改代码以调试** - 在出现错误的地方(通常是创建DataLoader的地方)之前,打印数据集的长度。例如,在`main.py`中找到创建训练数据集和验证数据集的地方,添加: ```python print('Number of training images: ', len(train_set)) print('Number of validation images: ', len(val_set)) ``` - 如果发现某个集合的长度为0,则进一步检查该集合的生成过程。 根据引用[1]中的例子,当出现`num_samples=0`时,说明传递给DataLoader的Dataset对象中样本数为0。因此,我们需要确保传递给DataLoader的数据集非空。 如果经过以上步骤仍未解决,可以尝试在项目的issue中搜索类似问题,或者考虑在项目仓库中提交issue。 下面是一个可能的修改实例(针对步骤4中的尺寸问题): 在训练命令中,我们可能使用了单尺度(`--scale`)训练,同时指定了`--patch_size`。例如: ```bash python main.py --scale 3 --patch_size 128 ... ``` 这时,根据引用[2]中的描述,由于128除以3(缩放比例)不是整数(128/3≈42.666),而代码中要求低分辨率图像块(LR)上采样后要与高分辨率图像块(HR)尺寸匹配,因此会出现问题。我们可以: - 将`patch_size`改为3的倍数(如126,因为126/3=42,然后HR的尺寸为42×3=126,与要求的patch_size一致)。 - 或者使用多尺度训练(添加`--multi_scale`参数),这样程序会自动调整尺寸。 因此,尝试使用以下命令进行训练(以放大倍数3为例): ```bash python main.py --scale 3 --patch_size 126 --model EDSR --n_resblocks 32 --n_feats 256 --res_scale 0.1 ``` 或者使用多尺度: ```bash python main.py --scale 3 --multi_scale --patch_size 128 --model EDSR --n_resblocks 32 --n_feats 256 --res_scale 0.1 ``` 如果问题仍然存在,请按照上述步骤仔细检查数据集路径和内容。 希望这些解决方案能帮助你解决问题。 §§相关问题§§ 1. 如何调整EDSR模型的超参数以提升性能? 2. 在训练EDSR模型时,如何避免过拟合? 3. 如何在自定义数据集上训练EDSR模型? </think>### 解决 `ValueError: num_samples=0` 错误的方法 在 Windows 复现 EDSR-PyTorch 项目时,`num_samples should be a positive integer value, but got num_samples=0` 错误表明数据加载器(DataLoader)无法找到有效样本。以下是系统性的解决方案: --- #### **1. 检查数据集路径配置** 错误通常由数据集路径错误导致: ```python # 修改 src/option.py 中的路径配置 'data_train': 'DIV2K', # 确保与数据集名称一致 'data_test': 'DIV2K', # 测试集同理 'dir_data': 'C:\\EDSR-PyTorch\\src\\data' # 使用双反斜杠的绝对路径 ``` 验证数据集是否位于正确路径: ``` src/data/ ├─ DIV2K/ ├─ DIV2K_train_HR/ ← 必须存在 ├─ DIV2K_train_LR_bicubic/ ← 必须存在 ``` > **验证方法**:在 Python 中运行: > ```python > import os > print(os.listdir('C:/EDSR-PyTorch/src/data/DIV2K')) # 检查文件是否存在 > ``` --- #### **2. 修复图像尺寸整除问题** 根据引用[2],当 `multi_scale=False` 时需确保: $$ \text{patch\_size} = \text{scale} \times (\text{patch\_size} // \text{scale}) $$ **解决方案**: ```bash # 训练时添加 --multi_scale 参数 python main.py --model EDSR --scale 4 --multi_scale --patch_size 192 # 或手动计算兼容尺寸(以 scale=3 为例): python main.py --scale 3 --patch_size 126 # 126 = 42 × 3 ``` --- #### **3. 检查数据加载逻辑** 在 `src/data/__init__.py` 中: ```python # 检查数据集类是否正确定义 if args.data_train == 'DIV2K': train_set = DatasetFromFolder(args, 'train') # 必须返回非空数据集 print(f"训练集样本数: {len(train_set)}") # 添加调试输出 ``` > 若输出为 0,检查 `DatasetFromFolder` 类是否: > - 正确解析了 `DIV2K_train_HR` 和 `DIV2K_train_LR_bicubic` > - 未因尺寸校验过滤所有样本 --- #### **4. 验证数据预处理** 在 `src/data/common.py` 中: ```python # 检查图像加载函数 def load_img(path): img = Image.open(path).convert('RGB') # 确保文件可读 print(f"成功加载: {path}") # 添加路径日志 return img ``` > **常见问题**: > - 图像损坏:重新下载 DIV2K 数据集 > - 路径含中文:将数据集移至纯英文路径 > - 权限问题:以管理员身份运行终端 --- #### **5. 完整验证流程** ```bash # 步骤 1: 数据路径验证 python -c "from src.data.div2k import DIV2K; print(DIV2K('train', dir_data='C:/EDSR-PyTorch/src/data').paths)" # 步骤 2: 样本数量检查 python -c "from torch.utils.data import DataLoader; from src.data import get_dataset; print(len(get_dataset('train')))" # 步骤 3: 最小化测试 python main.py --model EDSR --scale 2 --data_test Set5 --test_only ``` > 若 `Set5` 测试成功,则问题集中在训练数据集配置[^1][^2]。 --- #### **典型错误场景** | 场景 | 现象 | 解决方案 | |------|------|-----------| | 路径斜杠方向错误 | `FileNotFoundError` | 使用 `os.path.join()` 或双反斜杠 | | 尺寸不匹配 | `RuntimeError: size mismatch` | 启用 `--multi_scale` | | 空数据集 | `num_samples=0` | 检查 `DIV2K_train_HR/` 内容 | 通过以上步骤,99% 的 `num_samples=0` 错误可被解决。若仍存在问题,建议在项目 GitHub 提交 issue 并提供完整错误日志。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值