在读dcgan代码的过程中看到了一个nn.upsample的函数,于是打开函数释义看了一下,发现了一个view(1,1,2,2)的用法,不知其意,所以简单做了个试验(学习进度就是这样被落下的……)
释义中的代码为:
>>> input = torch.arange(1, 5, dtype=torch.float32).view(1, 1, 2, 2)
>>> input
tensor([[[[ 1., 2.],
[ 3., 4.]]]])
首先试验一下view(a,b),也就是括号内有两个参数的情况,这个很容易理解,就是将张量reshape为a*b的形式
>>>input=torch.arange(1,5,dtype=torch.float32)
>>>input
Out[5]: tensor([1., 2., 3., 4.])
>>>input=torch.arange(1,5,dtype=torch.float32).view(2,2)
>>>input
Out[7]:
tensor([[1., 2.],
[3., 4.]])
输出的结果为一个2*2的矩阵,最小组成单元为1*2的行向量
那我们再试一下view(a,b,c)
>>>input=torch.arange(1,5,dtype=torch.float32).view(2,2,3)
Traceback (most recent call last):
File "D:\Anaconda\envs\pytorch\lib\site-packages\IPython\core\interactiveshell.py", line 2862, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-8-961814ca6dc5>", line 1, in <module>
input=torch.arange(1,5,dtype=torch.float32).view(2,2,3)
RuntimeError: shape '[2, 2, 3]' is invalid for input of size 4
>>>input=torch.arange(1,5,dtype=torch.float32).view(2,2,1)
>>>input
Out[10]:
tensor([[[1.],
[2.]],
[[3.],
[4.]]])
这里可以看到,view(2,2,3)报错了,理由是view中参数的乘积不等于4,也就是tensor的大小
改为view(2,2,1)时,输出的结果为4*1的矩阵,但最小组成单元为1*1的元素
大师,我好像悟了
从左往右开始读,view(2,2,1),一共3层
第一个数字为2,说明最外面这层是2行
第二个数字为2,说明行向量内部也是2行
第三个数字为1,说明行向量的行向量内部为1行(搁着套娃呢),也就是最里面这层就1个元素
对于view(2,2),一共2层
第一个数字为2,说明最外面这层是2行
第二个数字为2,说明最里面这层行向量有2个元素
那我们再大胆猜一个view(4,1,1),一共3层
第一个数字为4,说明最外面这层是4行
第二个数字为1,说明行向量内部是1行
第三个数字为1,说明最里面这层只有一个元素
表现出来应该就是
让我们用代码试一下
>>>input=torch.arange(1,5,dtype=torch.float32).view(4,1,1)
>>>input
Out[12]:
tensor([[[1.]],
[[2.]],
[[3.]],
[[4.]]])
果然!!!嘿嘿嘿
那么让我们回到源代码上
>>> input = torch.arange(1, 5, dtype=torch.float32).view(1, 1, 2, 2)
>>> input
tensor([[[[ 1., 2.],
[ 3., 4.]]]])
不难理解,view(1,1,2,2)的意思是一共4层:
第一个数字为1,说明最外面这层是1行
第二个数字为1,说明行向量内部是1行
第三个数字为2,说明行向量的行向量内部为2行
第四个数字为2,说明最里面这层有两个元素,然而已经没有第5层了,说明没有2个以上的行向量了,只能是1*2的形式
也就是
总结一下,view括号内数字的个数,代表层数,每一层的组成单元一定是行向量,即行数为1的向量
数字从左到右对应从外往内的每一层行向量的个数,最后一个数字对应的是最内层行向量的列数