pytorch reshape_pytorch常用总结 之 tensor维度变换

小白最近刚开始使用pytorch,经常需要在各个网站反复查询一些函数的区别。但是不同的博客说的有时候不一样,趁着实验室停电,小白写了这篇文章,方便自己食用,不定期更新。如有错误,欢迎大家热烈指正。

第0章 敌动我也动,敌动我不动

之前写背包问题的时候,对序列B做更改的时候,(B=A) 序列A也跟着改变大小。这是因为A和B都指针指向了同一个地址。下面详细介绍:

c = [1,2]赋值的时候,python是创建一个地址,地址存放[1,2],此时c指针指向内存为[1,2]的地方;这个时候,d = c表示d的指针也指向[1,2]。因此,不管对c还是d进行操作,他们的变化都是一致的。比如d[0] = 3,此时c和d都变成了[3,2]。注意,如果d = [3,4],此时c输出的是[1,2],d输出的是[3,4]。我的理解是,d = [3,4]的时候,变量d指向存储[3,4]的内存,此时存储[1,2]的内存的标签名字依旧是c。

c = [1,2];d = c;
#d[0] = 3;
#d = d+2
d = [3,4]
print(c);print(d)
c = [1, 2]; d=[3, 4]
#c = [3, 2]; d=[3, 2]这一行对应d[0] = 3的输出

第一章 tensor维度变换

pytorch中常用tensor维度变换有两种方法,一种是a.view(),另一种是a.permute()。

假设a=torch.randn(1,2,3,4),a的数据是按照行优先的原则存储的(一般存储要求地址是连续的),这里24个变量的地址是连续的,且固定好的。(我们可以假设这24个数排成了一行,a 表示将这24个数按照[1,2,3,4]的格式使用)

1、b = a.view(1,2,2,6)

b 是将a中的元素,按照顺序逐个选取,凑成(1,2,2,6)的大小。

2、b = a.permute(0,1,3,2)

b 是按照a已经排好顺序,只改变a的轴。具体说就是将a的第二维度和第三维度进行互换

3、上代码

a = torch.randn(1,2,3,4);b = a.permute(0,1,3,2);c = a.view(1,2,4,3)
print(a);print(b);print(c)

不难看出,b和c虽然维度相同,但是每一个维度的数值并不是相同的。值得注意的是,如果对b进行b+200的操作,此时a的数值和c的数值是不会改变的;但是如果对b进行b[0]=b[0]+200的操作,此时a,b,c的数值都会改变。

b = b + 200

b=b+2
b[0] = b[0] + 200

b[0] = b[0] + 200

4、d = a.reshape()

reshape 和view方法的结果是一致的,但是view没有开辟新的内存空间,而reshape开辟了新的内存空间。尽管reshape开辟了新的内存空间,但是指向的底层元素地址依旧没有变换,也就是说,对d的操作会影响到a。

a = torch.randn(1,2,3,4);c = a.view(1,2,4,3);d = a.reshape(1,2,4,3);d[0] = d[0]+100
print(a);print(c);print(d)

你可能感兴趣的:(pytorch,reshape,pytorch,tensor)