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

这篇具有很好参考价值的文章主要介绍了DataLoader问题解决:RuntimeError: stack expects each tensor to be equal size, but got [3, 200, 200]entry1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        最近,在数据集处理并载入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 Image

transform = 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

 文章来源地址https://www.toymoban.com/news/detail-424711.html

 

到了这里,关于DataLoader问题解决:RuntimeError: stack expects each tensor to be equal size, but got [3, 200, 200]entry1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【解决问题】RuntimeError: The size of tensor a (80) must match the size of tensor b (56) at non-singleton

    你可以去github上,这儿我用的是YOLOv5.5的版本,就去Tags6里面的model/common.py里面去找到这个SPPF的类,把它拷过来到你这个Tags5的model/common.py里面,这样你的代码就也有这个类了,还要引入一个warnings包就行了 点开common.py文件 将这个复制到对应的类就行了。 刚解决了上一个问题,结

    2024年02月16日
    浏览(36)
  • RuntimeError: DataLoader worker is killed by signal: Killed.报错解决

    一、问题描述 使用pytorch进行训练时,训练了仅几个batch后出现报错信息: 这个报错和DataLoader有关,定位到训练脚本中的代码: 二、问题分析 通过设置num_workers,DataLoader实例可以使用多少个子进程进行数据加载,从而加快网络的训练过程。 默认情况下,num_workers值被设置为

    2024年02月12日
    浏览(36)
  • D2L,Pytorch win10下使用dataloader时出现runtimeerror: dataloader worker (pid(s) ) exited unexpectedly的解决方案

            我是用python3.8+pytorch1.11,在李沐老师的课程展示中使用的环境是linux没有报错,但win10下在dataloader使用前需要加上 例如: 即可成功运行         网上还有其他方法将num_worker设为0也可以单线程成功运行,不过直接导入d2l的dataloader没有对应的参数 可能原因:   

    2024年02月13日
    浏览(40)
  • 成功解决RuntimeError: batch2 must be a 3D tensor

    成功解决RuntimeError: batch2 must be a 3D tensor。 在深度学习的世界中,张量是构建一切的核心。它们是数据的容器,是模型训练的基石。然而,当我们尝试使用 torch.bmm() 函数进行批量矩阵乘法时,可能会遇到一个常见的错误:“RuntimeError: batch2 must be a 3D tensor”。这个错误提示似乎

    2024年02月22日
    浏览(50)
  • 报错解决:RuntimeError: expected scalar type Long but found Float

    nn.Linear需要作用于浮点数,这里可能输入了整数类型的张量作为参数。 报错: 把a转为float,结果为:

    2024年02月09日
    浏览(43)
  • 【已解决】Pytorch RuntimeError: expected scalar type Double but found Float

    本文作者: slience_me 在训练模型时候,将数据集输入到网络中去,在执行卷积nn.conv1d()的时候,报出此错误 报错堆栈信息 tensor的数据类型dtype不正确 这个错误通常是由于数据类型不匹配导致的。在PyTorch中,张量有不同的数据类型,如float32(FloatTensor)和float64(DoubleTensor)等

    2024年01月15日
    浏览(46)
  • dataset dataloader tensor list情况

    如上面代码所示,getitem期望返回一个tensor list 一个tensor,但是调用dataloader时只能接收到一个list,从打印内容中可以看到,dataloader中将getitem中返回的两个值都合并了。 从上述验证代码中可以看到,即使是相同类型的返回值,也不能分开来接收,返回的具体值为: 程序也会自

    2024年02月11日
    浏览(37)
  • 解决pytorch报错——RuntimeError: Expected to have finished reduction in the prior iteration...

    之前写代码时碰到了这样一个错误: RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates that your module has parameters that were not used in producing loss. You can enable unused parameter detection by (1) passing the keyword argument find_unused_parameters=True to torch.nn.pa

    2023年04月17日
    浏览(46)
  • 【解决】RuntimeError: Boolean value of Tensor with more than one value is ambiguous

    在用pytorch进行损失函数计算时,报错误: 翻译过来就是说: 具有多个值的张量的布尔值不明确  我是这报错: 啥意思?,你问我,我也不知道呀!、、、  错误原因分析: 其实是,因为我损失函数调用时没有初始化,所以导致报错 其实我是初始化了,但是因为没有+(),

    2024年02月16日
    浏览(47)
  • TypeError: expected Tensor as element 0 in argument 0, but got numpy.ndarray解决办法

    需要Tensor变量,我却给了numpy变量,所以转化一下就好啦!!

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包