Pytorch--Tensor的维度变换

目录

Pytorch--Tensor的维度变换

1、View/reshape

2、Squeeze/unsqueeze

3、Expand / repeat

4、其他方法

4.1、.t()

4.2、Transpose()

4.3、permute()


Pytorch--Tensor的维度变换

1、View/reshape

view

在变换过程中size相乘必须一样才可以变换

 

view操作会丢失dim信息

2、Squeeze/unsqueeze

unsqueeze

 [-a.dim()-1, a.dim()+1)

在这个范围内添加维度

0~a.dim()+1,是往下标的左边添加维度

例子:

squeeze

 

默认将所有维度信息为1的维度去除

传参传入,若相应下标为1则去除对应维度,不为1则保持不变

 3、Expand / repeat

Expand: broadcasting

Repeat: memory copied

一般用expand速度快(直接传入相应要变化的维度就好了)传入-1意思不改变维度

repeat传入的是要变化的倍数

4、其他方法

4.1、.t()

进行转置,只能是2维

4.2、Transpose()

 传入两个index,对指定index的维度进行交换

4.3、permute()

重置维度的顺序

b.permute(0,1,2,3)即保持不变

b.permute(0,2,3,1)即123发生交换位置

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码的作用是对输入的 `x` 张量进行预处理,并且返回一个新的张量 `x`,用于后续的处理。具体来说,它首先对输入的 `x` 张量进行循环,对每一个样本进行处理。对于每一个样本,它会进行以下步骤: 1. 将张量的第一维作为 batch_size,即 `batch_size = x.size(0)`。 2. 将张量沿着第一个维度进行循环,即 `for i in range(x.size(0)):`。 3. 将输入的 `x` 张量的第一个维度(batch_size)去掉,保留后面的三个维度作为一张图片的尺寸。 4. 对于每张图片,先将通道维度移到最后一个维度上,即 `y = y.permute(1, 2, 0)`。 5. 去掉通道维度,即 `y = y.squeeze(2)`。 6. 将图片转换为 numpy 数组,即 `y = y.cpu().numpy()`。 7. 对数组进行归一化,并转换为 uint8 类型,即 `img_norm_int = (y * 255).astype(np.uint8)`。 8. 将归一化后的数组进行缩放到 0-255 的范围内,即 `img_255 = img_norm_int / img_norm_int.max() * 255`。 9. 将缩放后的数组转换为 uint8 类型,即 `y = img_255.astype(np.uint8)`。 10. 通过 LSD 算法检测出图片中的线段,即 `lines = self.lsd.detect(cv2.convertScaleAbs(y))[0]`。 11. 判断检测出的线段是否小于 5 条,如果小于 5 条,则进行截取(即 `lines=cut_segments(lines, 5)`),补齐为 5 条,并转换为张量(即 `lines=torch.tensor(lines)`)。 12. 将线段转换为 numpy 数组,随机选择其中的 5 条线段(即 `indices = np.arange(len(lines))`、`np.random.shuffle(indices)`、`indices = indices[:5]`、`lines = lines[indices]`),并将其转换为张量(即 `lines = torch.from_numpy(lines)`)。 13. 如果线段的形状为 `[5,1,4]`,则将其压缩为 `[5,4]`。否则,不做处理(即 `if lines.shape == [5,1,4]:`、`lines = torch.squeeze(lines,dim=1)`)。 14. 将处理后的线段张量添加到 `tlist` 列表中(即 `tlist.append(lines)`)。 15. 将处理后的线段张量列表 `tlist` 堆叠成一个新的张量 `x`,并作为函数的返回值,即 `x = torch.stack(tlist, dim=0)`。 如果您有其他问题,可以继续提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值