jjzjj

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

方水云 2023-10-28 原文

        最近,在数据集处理并载入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的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  3. ruby-on-rails - 在没有 :total_entries to improve a lengthy query 的情况下使用 will_paginate - 2

    我有一个will_paginate的当前实现,它使用paginate_by_sql方法来构建要分页的集合。我们有一个针对total_entries的自定义查询,它非常复杂并且给我们的数据库带来了很大的负载。因此,我们想从分页中完全删除total_entries。换句话说,我们只需要一个“下一个-上一个”按钮,而不是“上一个1[2]345下一个”的典型分页显示。但我们需要了解一些事情。我们是否显示上一个链接?这当然只会发生在当前选择中显示的记录之前存在的记录我们是否显示下一个链接?如果显示集合中的最后一条记录,则不会显示此内容来自docsAqueryforcountingrowswill

  4. 电脑启动后显示器黑屏怎么办?排查下面4个问题,快速解决 - 2

    电脑启动出现显示器黑屏是一个相当常见的问题。如果您遇到了这个问题,不要惊慌,因为它有很多可能的原因,可以采取一些简单的措施来解决它。在本文中,小编将介绍下面4种常见的电脑启动后显示器黑屏的原因,排查这些原因,快速解决! 演示机型:联想Ideapad700-15ISK-ISE系统版本:Windows10一、显示器问题如果出现电脑启动后显示器黑屏的情况。那么首先您需要检查一下显示器是否正常工作。您可以通过更换另一个显示器或将当前显示器连接到另一台计算机来检查显示器是否存在问题。如果问题仍然存在,那么您可以排除显示器故障的可能性。 二、显卡问题如果您的电脑配备了独立显卡,那么显卡故障也可能是导致电脑

  5. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  6. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

  7. 【RuntimeError: CUDA error: device-side assert triggered】问题与解决 - 2

    RuntimeError:CUDAerror:device-sideasserttriggered问题描述解决思路发现问题:总结问题描述当我在调试模型的时候,出现了如下的问题/opt/conda/conda-bld/pytorch_1656352465323/work/aten/src/ATen/native/cuda/IndexKernel.cu:91:operator():block:[5,0,0],thread:[63,0,0]Assertion`index>=-sizes[i]&&index通过提示信息可以知道是个数组越界的问题。但是如图一中第二行话所说这个问题可能并不出在提示的代码段

  8. ruby-on-rails - Rails 在记录 200 OK 后在做什么? (调试响应时间慢) - 2

    我试图在我的RubyonRails应用程序中调试一个极其缓慢的请求调用。我已设法根据自己的喜好优化Controller方法,Rails的日志告诉我它已在XX毫秒内完成操作(Completed200OKin5049ms(Views:34.9ms|ActiveRecord:76.3ms)).但是,在加载页面时,在浏览器中实际呈现任何内容之前打印此消息很长;最多约15秒的等待时间。Rackmini-profiler证实了这一点,告诉我GET操作(不计算完成Controller操作所花费的时间)花费了14秒左右。(分析器还确认Controller操作的执行时间约为5秒)。我可以接受Contro

  9. ruby-on-rails - Rails Controller 中未定义的方法呈现 - 尝试使用 200 状态代码响应 Sendgrid - 2

    我正在使用SendgridParseAPI和Griddlergem来接受传入的电子邮件。在大多数情况下,这工作正常;但是,如果您未使用状态代码200响应Sendgrid,他们将假定该应用程序未正确接收POST请求并继续尝试进行POST3天。我正在尝试使用状态代码进行响应,但遇到了问题。在常规的RESTful路由中,您可以执行类似...render:status=>200但是,我认为这必须在Controller中完成才能识别渲染方法。Griddler建议您创建一个EmailProcessor模型并使用“处理”方法来处理电子邮件。据我了解,您不能在模型中使用渲染方法。因此,我使用类方法创建

  10. ruby - ruby 中#entries 和#to_a 的区别 - 2

    #entries之间的基本区别是什么?和#to_aEnumerable的方法ruby中的模块。两者似乎在Hash上返回相同的结果>>hash={"name"=>"foo","age"=>"23"}=>{"name"=>"foo","age"=>"23"}>>hash.to_a=>[["name","foo"],["age",23]]>>hash.entries=>[["name","foo"],["age",23]] 最佳答案 这是区别(查看#=>之后的输出):h={}h.method(:entries)#=>#h.method(:

随机推荐