我正在尝试从头开始实现ResNet。
在将数据集设置到Dataloader后,训练过程中出现了以下错误:
RuntimeError: stack expects each tensor to be equal size, but got [3, 224, 224] at entry 0 and [1, 224, 224] at entry 25
通常,我知道这条消息显示的原因。它与图像数据集不一致有关。
但在我收到这条消息之前,我已经应用了转换,所以我没想到会出现这样的错误。
有时候,消息中显示的是[4,224,224],而不是[1,224,224]。
当然,我检查了数据集中的所有图像都是彩色的。
这是代码:
## 类声明,转换代码在__getitem__()中应用
class cnd_data(torch.utils.data.Dataset):
def __init__(self, file_path, train=True, transforms=None):
self.train=train
self.transforms=transforms
self.cat_img_path=os.path.join(file_path, 'data\kagglecatsanddogs\PetImages\Cat')
self.dog_img_path=os.path.join(file_path, 'data\kagglecatsanddogs\PetImages\Dog')
self.cat_list=natsort.natsorted(glob.glob(self.cat_img_path + '/*.jpg'))
self.dog_list=natsort.natsorted(glob.glob(self.dog_img_path + '/*.jpg'))
if self.train==True:
self.imgn_list=self.cat_list[:12000]+self.dog_list[:12000]
self.img_label=[0]*12000+[1]*12000
else:
self.imgn_list=self.cat_list[12000:]+self.dog_list[12000:]
self.img_label=[0]*500+[1]*500
def __len__(self):
return len(self.img_label)
def __getitem__(self, idx):
image_data=Image.open(self.imgn_list[idx])
print(self.imgn_list[idx])
if self.transforms:
sample=self.transforms(image_data)
return sample, self.img_label[idx]
## 转换设置代码
transforms=transforms.Compose([
transforms.Resize(size=(224, 224)),
transforms.ToTensor()])
回答:
Pytorch期望任何数据样本在预处理后具有相同的大小,以便可以堆叠成一个单一的张量。根据您的错误日志,[3, 224, 224]
似乎指的是RGB图像;[1, 224, 224]
是灰度图像,而[4, 224, 224]
是RGBA(具有用于不透明度的alpha通道)。如果您使用PIL Image,请确保在应用任何转换之前将其转换为RGB。
Image.open(path).convert('RGB')