【问题标题】:How to split a Pytorch tensor into different dimensions?如何将 Pytorch 张量拆分为不同的维度?
【发布时间】:2021-06-22 15:40:04
【问题描述】:

我是 Pytorch 的新手。

假设我有一个具有这种形状的张量torch.size([1, 25200, 11])

我想将它分成 3 个较小的张量,3 个较小的张量中的每一个都具有 1st 的形状。 torch.size([1, 3, 80, 80, 11]) 和第二个torch.size([1, 3, 40, 40 , 11])3rd torch.size([1, 3, 20, 20, 11)].

非常感谢您的帮助。

谢谢

解释这些数字:

80x80x3 = 19200

40x40x3 = 4800

20x20x3=1200,加上这些结果我们有 25200,1 是批量大小,11 是类 + xywh

【问题讨论】:

  • numpy 类似,您可以使用torch.Tensor 方法来修改给定的张量(pytorch.org/docs/stable/tensors.html)。例如,您可以通过y = x[:, 0:19200, :] 索引张量x,然后重塑y = y.reshape([1, 3, 80, 80, 11])
  • 谢谢,您的评论类似于@andrew Holmgren,让我用我原来的张量进行测试,我会告诉您它是否适用于这种情况

标签: python pytorch tensor


【解决方案1】:

这样的事情应该可以工作。

import torch
tensor = torch.ones((1, 25200, 11))
first_break = tensor[:, 0:19200, :].view((1, 3, 80, 80, 11))
second_break = tensor[:, 19200:19200+4800, :].view((1, 3, 40, 40, 11))
third_break = tensor[:, 19200+4800:19200+4800+1200, :].view((1, 3, 20, 20, 11))

如果您提供更多解释和上下文,代码可能会被清理并且不会被如此硬编码,或者这可能足以让您运行。

【讨论】:

  • 感谢您的回答。实际上我正在使用 Scaled YOLOv4 ,我将 Scaled YOLOV4 模型转换为 ONNX 格式,当我使用 onnx 模型进行推断时,它给了我一个形状为 torch.size( [1, 25200, 11)]。当我将 .pt 转换为 .onnx 时,将具有上述形状的 export_pt2onnx.py 连接 3 个 yolo 层到 (1 , 25200, 11) 所以我想将 ([1, 25200, 11)] 拆分回 3 个原始张量 (3 yolo 层),所以我可以对其进行推断。
  • @frankenstein 没问题,我认为这样的事情正在发生。是的,很容易使用该代码块进行单个推理。我没怎么玩过 onnx,但是如果你正在运行批量推理,你可能需要将 25200*n 分成 25200 的块。 view(n,.) 而不是 view(1,..) 应该可以工作,但是不确定 onnx 将如何构建它,可能需要一些维度排列或其他东西。
【解决方案2】:

你试过了吗:


  T1= torch.narrow(YourTensor, 1,0 , 80*80*3)
  T1v = T1.view(1,3,80,80,11)

  T2= torch.narrow(YourTensor, 1,80*80*3 , 40*40*3)
  T2v = T2.view(1,3,40,40,11)

  T3= torch.narrow(YourTensor, 1,80*80*3 + 40*40*3 , 20*20*3)
  T3v = T3.view(1,3,20,20,11)

【讨论】:

    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 2020-08-26
    • 2021-10-23
    • 2017-09-05
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多