自定义数据集训练CNN遇张量尺寸不匹配错误,Resize无效求排查
解决RuntimeError: stack expects each tensor to be equal size的问题
你遇到的错误核心原因是:transforms.Resize(224)并没有把所有图像统一缩放到固定的224×224尺寸。
当只给Resize传一个整数参数时,PyTorch会按照保持原图像宽高比的规则,将图像的短边缩放到224,长边按比例自动缩放。比如原本宽高比例不同的图片,处理后会得到[3,224,255]、[3,224,351]这类尺寸不一致的张量,而DataLoader在打包batch时要求所有张量尺寸完全相同,因此触发stack操作的报错。
两种可行的解决方法:
方法1:强制缩放到固定尺寸
直接给Resize传入宽高组成的元组,强制将所有图像缩放到224×224,无需保持原比例:
#------------------------train transform----------------------# train_transform=transforms.Compose([ transforms.Resize((224, 224)), # 指定固定宽高 transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)), ]) #------------------------test transform------------------------------# test_transform=transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)), ])
方法2:先缩放再裁剪(保持原比例更友好)
先将短边缩放到一个比目标尺寸大的值(比如256),再通过裁剪得到固定尺寸224×224,这种方式能避免图像过度拉伸,训练时还能加入随机裁剪增强数据:
#------------------------train transform----------------------# train_transform=transforms.Compose([ transforms.Resize(256), # 短边缩至256,保持比例 transforms.RandomCrop(224), # 随机裁剪224×224 transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)), ]) #------------------------test transform------------------------------# test_transform=transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), # 中心裁剪224×224 transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)), ])
调整后重新运行代码,DataLoader就能正常打包batch,不会再出现尺寸不匹配的报错。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

