相当于numpy中resize()的功能,但是用法可能不太一样。
我的理解是:
把原先tensor中的数据按照行优先的顺序排成一个一维的数据(这里应该是因为要求地址是连续存储的),然后按照参数组合成其他维度的tensor。
比如说是不管你原先的数据是[[[1,2,3],[4,5,6]]]还是[1,2,3,4,5,6],因为它们排成一维向量都是6个元素,所以只要view后面的参数一致,得到的结果都是一样的。
比如,
1
2
3
4
|
a = torch.Tensor([[[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]]]) b = torch.Tensor([ 1 , 2 , 3 , 4 , 5 , 6 ]) print (a.view( 1 , 6 )) print (b.view( 1 , 6 )) |
得到的结果都是
1
|
tensor([[ 1. , 2. , 3. , 4. , 5. , 6. ]]) |
再看一个例子:
1
2
|
a = torch.Tensor([[[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]]]) print (a.view( 3 , 2 )) |
将会得到:
1
2
3
|
tensor([[ 1. , 2. ], [ 3. , 4. ], [ 5. , 6. ]]) |
相当于就是从1,2,3,4,5,6顺序的拿数组来填充需要的形状。但是如果您想得到如下的结果:
1
2
3
|
tensor([[ 1. , 4. ], [ 2. , 5. ], [ 3. , 6. ]]) |
就需要使用另一个函数了:permute()。用法参见我的另一篇博客:PyTorch中permute的用法
另外,参数不可为空。参数中的-1就代表这个位置由其他位置的数字来推断,只要在不致歧义的情况的下,view参数就可以推断出来,也就是人可以推断出形状的情况下,view函数也可以推断出来。
比如a tensor的数据个数是6个,如果view(1,-1),我们就可以根据tensor的元素个数推断出-1代表6。
而如果是view(-1,-1,2),人不知道怎么推断,机器也不知道。
还有一种情况是人可以推断出来,但是机器推断不出来的:view(-1,-1,6),人可以知道-1都代表1,但是机器不允许同时有两个负1。
如果没有-1,那么所有参数的乘积就要和tensor中元素的总个数一致了,否则就会出现错误。
补充:pytorch中x.view()和permute用法
pytorch中x.view()用法
在pytorch中经常会看到x.view(),它表示将Tensor的维度转变为view指定的维度,有点类似于resize函数
1
2
3
4
5
6
7
|
b = torch.Tensor([[[[ 1 , 2 , 3 ],[ 4 , 5 , 6 ],[ 7 , 8 , 9 ]],[[ 1 , 2 , 3 ],[ 4 , 5 , 6 ],[ 7 , 8 , 9 ]]]]) print (b.size()) ( 1 , 2 , 3 , 3 ) print (b.view(b.size( 0 ), - 1 )) tensor([[ 1. , 2. , 3. , 4. , 5. , 6. , 7. , 8. , 9. , 1. , 2. , 3. , 4. , 5. , 6. , 7. , 8. , 9. ]]) print (b.view(b.size( 0 ), - 1 ).size()) ( 1 , 18 ) |
b.size(0)表示b中0维度==1,-1是按照原数据自动分配的列数。
1
2
3
4
5
6
7
8
9
10
11
12
|
a = torch.Tensor([[[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]]]) print (a.size()) ( 1 , 2 , 3 ) print (a.view( 6 , - 1 )) tensor([[ 1. ], [ 2. ], [ 3. ], [ 4. ], [ 5. ], [ 6. ]]) print (a.view( 6 , - 1 ).size()) ( 6 , 1 ) |
将a转变成6行1列
1
2
|
print (a.view( - 1 , 6 ).size()) ( 1 , 6 ) |
或者将a转变成1行6列
在程序里还经常见到view函数后面跟着permute()函数,这个函数是做维度换位的
1
2
3
4
5
6
7
8
9
|
print (a.view( - 1 , 6 ).permute( 1 , 0 )) tensor([[ 1. ], [ 2. ], [ 3. ], [ 4. ], [ 5. ], [ 6. ]]) print (a.view( - 1 , 6 ).permute( 1 , 0 ).size()) ( 6 , 1 ) |
加了permute,a就由(1,6)变成(6,1)了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://york1996.blog.csdn.net/article/details/81949843