首页 > 编程问答 >RuntimeError:permute(sparse_coo):张量输入中的维度数与所需维度排序的长度不匹配

RuntimeError:permute(sparse_coo):张量输入中的维度数与所需维度排序的长度不匹配

时间:2024-07-30 10:12:20浏览次数:15  
标签:python pytorch computer-vision tensor clip

因此,我使用这个剪辑模型来执行一些标记任务。但是当我使用剪辑模型的文本编码器时,它会出现以下错误:

    <ipython-input-117-4c513cc2d787> in forward(self, batch)
     34     print(y.size())
     35     print(y.dim())
---> 36     y = self.text_encoder(y)
     37     y = self.classifier(y)
     38 

/usr/local/lib/python3.10/dist-packages/clip/model.py in encode_text(self, text)
    345         x = x + self.positional_embedding.type(self.dtype)
    346         x = x.permute(1, 0, 2)  # NLD -> LND
--> 347         x = self.transformer(x)
    348         x = x.permute(1, 0, 2)  # LND -> NLD
    349         x = self.ln_final(x).type(self.dtype)

RuntimeError: permute(sparse_coo): number of dimensions in the tensor input does not match the length of the desired ordering of dimensions i.e. input.dim() = 4 is not equal to len(dims) = 3

问题是,一张图像的标签有多个,因此我在数据加载器中使用 collat​​e_fn 和 pad_sequence,然后再输入模型。|| |我已经打印出

  def pad_sequence(batch):
    return torch.nn.utils.rnn.pad_sequence(batch, batch_first=True, padding_value=0)
  def my_collate_fn(batch):    
    batch['i'] = torch.stack(batch['i'].float())
    batch['l'] = pad_sequence(batch['l'].long())      
    return batch

 class CustomCLIP(torch.nn.Module):
  def __init__(self, num_classes: int = 10, bias=False):
    super().__init__()
    #model, _ = clip.load("RN50")

  def forward(self, batch): 
    x = batch['i']
    x = self.encoder(x)
    x = self.classifier(x)
    y = batch['l']
    print(y)
    print(y.size())
    print(y.dim())
    y = self.text_encoder(y) #error on this line
    y = self.classifier(y)
    x_similarity = x @ x.T
    y_similarity = y @ y.T
    targets = F.softmax(
      (x_similarity + y_similarity) / 2 * temperature, dim=-1
    )
    outputs = (y @ x.T) / temperature

    return outputs, targets

的尺寸。它的3与长度尺寸相匹配。那么为什么会出现输入张量维度为 4 的错误? y 请有人指出问题是什么以及如何解决。提前致谢。

        [[49406,   332, 49407,  ...,     0,     0,     0],
         [49406,   320, 49407,  ...,     0,     0,     0],
         [49406,   333, 49407,  ...,     0,     0,     0],
         ...,
         [    0,     0,     0,  ...,     0,     0,     0],
         [    0,     0,     0,  ...,     0,     0,     0],
         [    0,     0,     0,  ...,     0,     0,     0]]], device='cuda:0')
torch.Size([32, 392, 77])
3

Someone please point out whats the issue and how to solve it. Thanks in advance.


该错误“RuntimeError: permute(sparse_coo): 张量输入中的维度数与所需维度排序的长度不匹配,即 input.dim() = 4 不等于 len(dims) = 3”表明正在尝试对形状不兼容的 4 维张量执行 permute 操作。尽管打印出的 y 的尺寸表明它是一个 3 维张量,但进入 text_encoder 的张量实际上是 4 维的。

问题出在代码中未显示的位置。以下是对该问题的分解和可能的解决方案:

  1. pad_sequence 的输出: 虽然 pad_sequence 通常用于对序列进行批处理,为批处理中的所有序列创建统一的长度,但如果输入已经是填充张量,它可能会增加一个额外的维度。检查 pad_sequence 之后的 y 的形状。如果它已经是 3 维的(批大小、序列长度、嵌入维度),则不需要 pad_sequence

  2. 文本编码器的输入: CLIP 模型的 text_encoder 要求输入为 3 维张量: (批大小、序列长度、嵌入维度) 。确保传递给 text_encoder y 的形状正确。

  3. 调试形状: 在代码的以下位置添加打印语句以检查张量的形状:

  4. pad_sequence 之后,但在将其分配回 batch['l'] 之前: python padded_y = pad_sequence(batch['l'].long()) print("Padded y shape:", padded_y.shape) batch['l'] = padded_y
  5. forward 方法中,就在传递给 text_encoder 之前: python print("y shape before text_encoder:", y.shape) y = self.text_encoder(y)

这将帮助查明哪个部分引入了额外的维度。

  1. 移除额外的维度: 一旦确定了添加额外维度的位置,就可以通过以下方式之一来移除它:
  2. 如果是 pad_sequence 导致了问题,并且的输入已经是填充张量,请移除对 pad_sequence 的调用。
  3. 如果在其他地方添加了维度,请使用 squeeze 函数移除单例维度。例如,如果 y 的形状为 (32, 1, 392, 77) ,则可以使用 y = y.squeeze(1) 将其重塑为 (32, 392, 77)

通过仔细检查每个步骤中张量的形状并根据需要进行调整,可以解决此错误并确保的代码按预期工作。

标签:python,pytorch,computer-vision,tensor,clip
From: 76338180

相关文章

  • Open3D点云裁剪-用Python实现高效的点云处理技术
    点云数据是计算机视觉领域中常用的一种数据表示形式,它以三维空间中的离散点集合的方式来描述物体的形状和结构,在点云数据处理过程中,点云裁剪是一项关键任务,它可以帮助我们从原始的点云数据中提取出感兴趣的物体或区域,从而提高数据处理效率和准确性,本文将介绍如何使用Open3D库和......
  • Python,计算HSV图像的直方图,忽略背景
    我正在尝试使用openCV计算HSV图像的直方图,使用以下代码:defistogrammaHSV(image,histSize):hsv_planes=cv2.split(image)histSize=histSizehistRange=(0,256)accumulate=Falseh_hist=np.array(cv2.calcHist(hsv_planes,[0],None,[......
  • python性能分析器:cProfile
    代码:(1)importcProfileimportrecProfile.run('re.compile("foo|bar")')运行结果:(2)importcProfiledefrunRe():importrecProfile.runctx('re.compile("foo|bar")',None,locals())runRe()运行结果:(3)i......
  • 基于Python网络招聘数据可视化分析系统的设计与实现
    基于Python网络招聘数据可视化分析系统的设计与实现DesignandImplementationofPython-basedNetworkRecruitmentDataVisualizationAnalysisSystem完整下载链接:基于Python网络招聘数据可视化分析系统的设计与实现文章目录基于Python网络招聘数据可视化分析系......
  • 即使使用 docker run -dit 命令,python-Docker 容器也会在运行两秒后退出
    我想从此处使用Dockerfile测试自定义kubernetes调度程序:FROMpython:3.7RUNpipinstallkubernetesCOPYscheduler.py/scheduler.pyCMDpython/scheduler.py一旦创建了映像和容器:dockerbuild-tapp.dockercontainerrun-d-it--namemy-sched......
  • PyTorch 数据集中某些类的训练验证拆分结果为零样本
    我正在使用PyTorch进行图像分类。我的数据集是目录格式。我已经设置了数据管道和模型。尽管如此,我在训练验证分割中遇到了一个问题,其中某些类在训练或验证数据集中的样本为零。这是我的代码和设置的相关部分:classCustomDataset(Dataset):def__init__(self,root_dir,......
  • Python多重处理,如何避免创建具有百万个对象的元组
    python多处理新手。我有一项任务,涉及访问网络服务数百万次并将响应保存在文件中(每个请求都有单独的文件)。我已经得到了高级工作代码,但对一些事情没有感到困惑。以下两种语法有什么区别?pool=Pool(processes=4)pool.starmap(task,listOfInputParametersTu......
  • Python OpenCV - 显示坏像素检查测试
    我想找到显示器中存在的每个坏像素。坏像素可能是颜色不正确的像素,或者像素只是黑色。显示屏的尺寸为160x320像素。所以如果显示效果好的话,必须有160*320=51200像素。如果显示器没有51200像素,那就是坏的。另外,我想知道每个坏像素的位置。一旦拍摄的图像太大,我将共享一个......
  • 在python日志输出的每一行前面添加变量缩进
    我正在将日志记录构建到一个Python应用程序中,我希望它是人类可读的。目前,调试日志记录了调用的每个函数以及参数和返回值。这意味着,实际上,嵌套函数调用的调试日志可能如下所示:2024-07-2916:52:26,641:DEBUG:MainController.initialize_componentscalledwithargs<control......
  • 使用 DQN 实现 pong,使用 python 中的特征向量而不是像素。我的 DQNA 实现代码正确吗,因
    我正在致力于使用OpenAI的Gym为Pong游戏实现强化学习(RL)环境。目标是训练人工智能代理通过控制球拍来打乒乓球。代理收到太多负面奖励,即使它看起来移动正确。具体来说,奖励函数会惩罚远离球的智能体,但这种情况发生得太频繁,即使球朝球拍移动时似乎也会发生。观察......