在Kaggle猫狗数据集上训练ResNet18停滞在0%的问题求助
训练ResNet18停滞在0%的排查与解决步骤
1. 优先排查数据加载环节(最常见原因)
即使确认数据集可访问,仍可能存在以下问题:
- 损坏图片文件阻塞加载:Kaggle猫狗数据集自带部分无法正常读取的损坏文件(如
PetImages/Cat/666.jpg、PetImages/Dog/11702.jpg),加载时会导致进程无响应。
解决:遍历数据集检测并删除损坏文件:import os from PIL import Image data_dir = "kagglecatsanddogs_5340/PetImages" for folder in ["Cat", "Dog"]: folder_path = os.path.join(data_dir, folder) for filename in os.listdir(folder_path): file_path = os.path.join(folder_path, filename) try: img = Image.open(file_path) img.verify() except (IOError, SyntaxError): print(f"删除损坏文件: {file_path}") os.remove(file_path) - DataLoader参数设置不当:
num_workers过高会引发多进程加载冲突,复杂预处理也可能导致阻塞。
解决:先将num_workers设为0(单进程加载),简化预处理流程(仅保留resize、归一化),测试是否能正常运行,再逐步恢复参数。 - 数据集长度统计错误:进度显示的
0/5015需与实际有效图片数量匹配,若大量文件无效,会导致加载逻辑异常。
2. 检查模型与训练流程
- 模型结构错误:自定义层逻辑问题或全量训练时误设
requires_grad=False,会导致反向传播卡住。
解决:先使用预训练ResNet18替换分类头的最简结构测试:import torch import torchvision.models as models model = models.resnet18(pretrained=True) num_ftrs = model.fc.in_features model.fc = torch.nn.Linear(num_ftrs, 2) - 损失/优化器配置错误:比如
CrossEntropyLoss输入需为模型原始logits(无需手动softmax),优化器未正确绑定模型参数。
解决:确认损失函数输入维度匹配,优化器参数为model.parameters()。
3. 环境与硬件排查
- GPU显存不足:显存占满会导致进程陷入等待,无报错但停滞。
解决:降低batch_size(如从32降至16),或用torch.cuda.empty_cache()清理显存后重启训练。 - 系统资源限制:远程服务器或Kaggle Notebook可能因CPU/内存占用过高导致进程挂起。
解决:重启进程,用nvidia-smi查看GPU状态,top查看CPU/内存占用。
内容的提问来源于stack exchange,提问作者TAT
相关产品推荐
相关产品推荐

