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

[Pytorch踩坑]相同shapesize的Tesnor但是Stride不同;不同维度的Tesnor变换。,第1张

问题描述

从同一个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[..., :4]
tensor4 = torch.Tensor(1,3,4,4,4)

print("tensor_org.shape===>",tensor_org.shape)
print("tensor3.shape===>",tensor3.shape)
print("tensor4.shape===>",tensor4.shape)

print("tensor_org.stride()===>",tensor_org.stride())
print("tensor3.stride()===>",tensor3.stride())
print("tensor4.stride()===>",tensor4.stride())

测试一组代码,其中tensor_org是原始的一个(1,3,4,4,6)大张量,分别用两种方法建立两个与高维与org相同,一维只有4个元素的张量,命名为tensor3,tensor4,他们的size均为(1,3,4,4,4),这里省略赋值部分。

tensor_org.shape===> torch.Size([1, 3, 4, 4, 6])
tensor3.shape===> torch.Size([1, 3, 4, 4, 4])
tensor4.shape===> torch.Size([1, 3, 4, 4, 4])
tensor_org.stride===> (288, 96, 24, 6, 1)
tensor3.stride===> (288, 96, 24, 6, 1)
tensor4.stride===> (192, 64, 16, 4, 1)

在对这三个向量进行shape与stride的时候发现,tensor3与tensor4的size相同,但是tensor3与tensor4的stride的不相同,反而与tensor_org的stride相同。
问题就出现在这里,虽然tensor3的形状从org取出并与通过torch.Tensor建立的张量结构相同,但是stride继承的是tensor_org的,所以tensor3在使用view时会出现stride不匹配的问题。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/717472.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-25
下一篇2022-04-25

发表评论

登录后才能评论

评论列表(0条)

    保存