最近,在数据集处理并载入DataLoader进行训练的时候出现了问题:

RuntimeError: stack expects each tensor to be equal size,
but got [3, 200, 200] at entry 0 and [1, 200, 200] at entry 1

我看了一下,大意就是维度也就是通道数不匹配,所以我觉得应该是数据集图片出现了问题。以下是我的普通数据集处理代码:

import torch
import torchvision.transforms as transforms
from torch.utils.data import Dataset, DataLoader
import os
from PIL import Imagetransform = transforms.Compose([transforms.RandomCrop((200, 200)),    #需要进行同意大小,不然会报错transforms.ToTensor(),
])class PreprocessDataset(Dataset):"""预处理数据集类"""def __init__(self, HRPath):"""初始化预处理数据集类"""img_names = os.listdir(HRPath)self.HR_imgs = [HRPath + "/" + img_name for img_name in img_names]def __len__(self):"""获取数据长度"""return len(self.HR_imgs)def __getitem__(self, index):"""获取数据"""HR_img = self.HR_imgs[index]HR_img = Image.open(HR_img)HR_img = transform(HR_img)return HR_img     if __name__ == '__main__':HRPath = r"D:\datasets\ImageNet\train"datasets = PreprocessDataset(HRPath)trainData = DataLoader(datasets, batch_size=1, shuffle=False)for i, HR_img in enumerate(trainData):print(i, HR_img.shape)

我一张一张图片放入DataLoader,然后按顺序一张一张的查看它们的维度,然后出现如下错误:

'''结果'''
146 torch.Size([1, 3, 200, 200])
147 torch.Size([1, 3, 200, 200])ValueError: empty range for randrange() (0,-55, -55)

我找到出错前按顺序查到了第149(从0开始)张图片的维度,点开发现这张图片的最短边小于200,不能进行随机裁剪transforms.RandomCrop((200, 200)),所以我进行了transforms.Resize(400),把图片最短边放大到400。

transform = transforms.Compose([transforms.Resize(400),transforms.RandomCrop((200, 200)),    #需要进行同意大小,不然会报错transforms.ToTensor(),
])

在次运行并不发生错误,但这是在DataLoader的batch_size=1张图片的情况下。所以把batch_size改成多张图片再次运行:

if __name__ == '__main__':HRPath = r"D:\datasets\ImageNet\train"# os.listdir(HRPath)datasets = PreprocessDataset(HRPath)a = datasets[89]print(a.shape)trainData = DataLoader(datasets, batch_size=16, shuffle=False)for i, HR_img in enumerate(trainData):print(i, HR_img.shape)

发生错误:

'''结果'''
0 torch.Size([16, 3, 200, 200])
1 torch.Size([16, 3, 200, 200])
2 torch.Size([16, 3, 200, 200])
3 torch.Size([16, 3, 200, 200])
4 torch.Size([16, 3, 200, 200])RuntimeError: stack expects each tensor to be equal size,
but got [3, 200, 200] at entry 0 and [1, 200, 200] at entry 9

从不出错的结果上看,定位图片问题所在的索引应该在80-96之间,那么缩小问题图片的方位,把batch_size=2:

if __name__ == '__main__':HRPath = r"D:\datasets\ImageNet\train"# os.listdir(HRPath)datasets = PreprocessDataset(HRPath)a = datasets[89]print(a.shape)trainData = DataLoader(datasets, batch_size=2, shuffle=False)for i, HR_img in enumerate(trainData):print(i, HR_img.shape)

错误定位到第89或者第90张图片:

'''结果'''
0 torch.Size([2, 3, 200, 200])
...
...
43 torch.Size([2, 3, 200, 200])RuntimeError: stack expects each tensor to be equal size, but got [3, 200, 200] at entry 0 and [1, 200, 200] at entry 1

输出第89张图片的维度:

if __name__ == '__main__':HRPath = r"D:\datasets\ImageNet\train"# os.listdir(HRPath)datasets = PreprocessDataset(HRPath)a = datasets[89]print(a.shape)

结果:

torch.Size([1, 200, 200])

真的是通道数不统一,醉了啊!

解决方法,在图片预处理的时候,将所有图片都转成"RGB"三通道的模式:

HR_img = Image.open(HR_img).convert('RGB')   #全部以三通道形式打开

解决完成!!!!

DataLoader问题解决:RuntimeError: stack expects each tensor to be equal size, but got [3, 200, 200]entry1相关推荐

  1. RuntimeError: stack expects each tensor to be equal size, but got xxx at entry 0 at entry 1

    今日做模型训练,Pytorch在加载数据时遇到如下错误: Epoch 1/800: 31%|███ | 4/13 [00:03<00:07, 1.27img/s, loss (batch)=1. ...

  2. RuntimeError: stack expects each tensor to be equal size

    在调试densenet进行分类任务的代码时,在图像预处理的过程中遇到下列错误: RuntimeError: stack expects each tensor to be equal size, bu ...

  3. RuntimeError: stack expects each tensor to be equal size, but got [8] at entry 0 and [2] at entry 2

      最近在调试pytorch代码的时候遇到如下问题,由于他报错的地方不是在我们自己写的代码,而是在pytorch的包里,所以一开始就一头雾水.   在查阅了资料以后http://www.zzvips. ...

  4. stack expects each tensor to be equal size, but got [3, 224, 224] at entry 0 and [1,224,224] at entr

    首先可以确定地是在数据读取的以及处理发生的问题.目前可以归纳为一下两种: 1:使用Image.open()没有添加.convert('RGB') 错误代码例子: class Mydataset(dat ...

  5. stack expects each tensor to be equal size, but got [3, 40, 160] at entry 0 and [4, 40, 160] at entr

    这个问题是通道数不一样导致的,本质上是图像的问题 加载图像时加上.convert('RGB')即可 data = Image.open(imgPath).convert('RGB')

  6. 解决RuntimeError: stack expects a non-empty Tensorlist问题

    在batch_size时,可能某些地方需要batch>1的时候才能运行,但在创建dataloader时,可能最后一个batch的大小正好为1,所以会导致这种错误. 为了解决这种情况,将datal ...

  7. RuntimeError: each element in list of batch should be of equal size

    RuntimeError: each element in list of batch should be of equal size 示例代码: import os import re from t ...

  8. 问题解决 docker stack 部署后 REPLICAS 为 0

    原文 https://blog.csdn.net/u013054888/article/details/90741042 问题描述 使用 docker stack deploy -c docker-c ...

  9. Cityscapse 数据集使用 + 训练 STDC踩坑

    官网地址:Cityscapes Dataset – Semantic Understanding of Urban Street Scenes (cityscapes-dataset.com) get ...

最新文章

  1. 操作系统学习2:操作系统的发展和概览
  2. 上传图片和导出文件测试用例
  3. 解决windows找不到D:launcher\launcher.exe的方法
  4. Zabbix监控agent
  5. 我的世界java版和基岩版对比_我的世界:基岩版比Java多出的七个特性,都听过的非老mc莫属了!...
  6. LeetCode之Island Perimeter
  7. [XSY3381] 踢罐子(几何)
  8. (转)在阿里,我们如何管理代码分支?
  9. 【HDU - 6184】Counting Stars(三元环计数,二分,优化暴力,O(m*sqrt(m)),图论)
  10. python基础元组和列表区别(六)
  11. 这有8个小秘诀,让你更懂CSS!
  12. 折扇的保养方法是什么?
  13. 华为P7电信4G版刷机包 EMUI2.3 官方B125 第3版 精简 ROOT
  14. Programming WCF Services翻译笔记(八)
  15. 思科交换机配置试题_思科交换机配置命令
  16. 测试篇之一 sd卡独写速度测试
  17. 3dmax java,基于Java 3D与3DS MAX的虚拟校园设计
  18. 算法导论--麻省理工学院公开课
  19. Java DateUtil 时间工具类
  20. ttys和tty_Linux中tty、pty、/dev/ttySn等概念讲解

热门文章

  1. python实现一元二次方程求解
  2. c 语言已知两点求第三点,已知3点座标,求第一点到第二点和第三点构成的直线的距离。...
  3. 【日常练习】递增数列 【迭代加深】
  4. 图嵌入Node2Vec安装
  5. oracle中raw是什么格式,oracle中RAW数据类型
  6. COMPAQ CQ36 拆解全纪实
  7. Echarts配置项-2
  8. oracle中数据文件创建,操作oracle中的数据文件
  9. 米家iHealth体温计拆解
  10. [转]报表工具的考查指标与比较