.shape用法
在CNN中,我们在接入全连接层的时候,我们需要将提取出的特征图进行铺平,将特征图转换为一维向量。
这时候我们用到.view做一个resize的功能,用.shape来进行选择通道数。
我现在先说括号里的.shape()。
.shape()和.size()用法有点类似。
.shape[0]和.size(0)都是提取一维参量。
比如,
CNN特征图feature最终输出为(50,16,4,4)(B,C,H,W)
那么.shape[0]和.size(0)就是提取50(batch_size)这个数据。
.view()用法
比如,
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))
得到的结果都是tensor([[1., 2., 3., 4., 5., 6.]])
a=torch.Tensor([[[1,2,3],[4,5,6]]])
print(a.view(3,2))
得到结果:tensor([[1., 2.],[3., 4.],[5., 6.]])
参数中的-1就代表这个位置由其他位置的数字来推断,只要在不致歧义的情况的下,view参数就可以推断出来,也就是人可以推断出形状的情况下,view函数也可以推断出来。比如a tensor的数据个数是6个,如果view(1,-1),我们就可以根据tensor的元素个数推断出-1代表6。
关于output = self.fc(feature.view(img.shape[0], -1))
就是子啊fc全连接之前,
比如最终生成(50,16,4,4)的特征图
我们将16张7*7特征图铺平为一个一维向量。因为batch_size设置为50. 那么img.shape[0]=50。
我们就生成了50 个 一位向量。输进全连接层。