[Pytorch踩坑]相同shape/size的Tesnor但是Stride不同;不同维度的Tesnor变换。

本文讨论了在Pytorch中,从同一张量截取的大小相同但Stride不同的张量问题。当尝试使用View操作时遇到错误,通过官方文档推荐的方法解决了问题。然而,即使形状相同,截取的张量Stride仍与原始张量相同,导致视图操作出现 stride 不匹配。解决方案是使用特定的张量构造方法确保正确Stride。
摘要由CSDN通过智能技术生成

问题描述

从同一个Tensor中取出的俩个相同size的张量重新赋值后,使用View进行变换时候,其中一个出现
view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use reshape(...) instead.
提醒tensor的步长不同,使用

Tensor.reshape()

代替,其实这个确实可以解决问题,根据官方文档使用

Tensor.contiguous().view()

也同样可以解决,且之后的size与stride是相同的。
但是问题来了,为什么从同一个张量中取得的两个size相同的Tensor的stride却不同呢?

问题解决

tensor_org = torch.Tensor(1,3,4,4,6)
tensor3 = tensor_org[...<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nn.MaxUnpool2d(kernel_size=5, stride=2, padding=2)是一个反池化层,它的作用是将池化层的输出恢复成输入的大小和形状。它的输入张量的大小应该是经过了池化操作后的张量大小,输出张量的大小应该和池化操作前的输入张量大小相同。具体来说,假设输入张量的形状是$(N, C, H_{in}, W_{in})$,则经过MaxPool2d池化操作(kernel_size=2, stride=2)后,输出张量的形状是$(N, C, H_{out}, W_{out})$,其中$H_{out}=\lfloor\frac{H_{in}}{2}\rfloor$,$W_{out}=\lfloor\frac{W_{in}}{2}\rfloor$。然后再经过一个反池化层nn.MaxUnpool2d(kernel_size=5, stride=2, padding=2)后,输出张量的形状应该和输入张量的形状相同,即$(N, C, H_{in}, W_{in})$,例如: ```python import torch.nn as nn import torch # 输入张量形状为(N, C, H_in, W_in) x = torch.randn(2, 3, 6, 6) # 经过MaxPool2d池化操作,输出张量形状为(N, C, H_out, W_out) pool = nn.MaxPool2d(kernel_size=2, stride=2) y = pool(x) print(y.shape) # torch.Size([2, 3, 3, 3]) # 经过MaxUnpool2d反池化层,输出张量形状应该和输入张量形状相同 unpool = nn.MaxUnpool2d(kernel_size=5, stride=2, padding=2) z = unpool(y, indices=None, output_size=(6, 6)) print(z.shape) # torch.Size([2, 3, 6, 6]) ``` 上述代码中,输入张量的形状为$(2,3,6,6)$,经过MaxPool2d池化操作后,输出张量的形状为$(2,3,3,3)$,然后通过MaxUnpool2d反池化层,输出张量的形状应该和输入张量的形状相同,即$(2,3,6,6)$。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值