我view()对以下代码片段中的方法感到困惑。
view()
class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2,2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16*5*5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 16*5*5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x net = Net()
我的困惑是关于以下几行。
x = x.view(-1, 16*5*5)
tensor.view()函数有什么作用?我已经在很多地方看到了它的用法,但是我不明白它是如何解释其参数的。
tensor.view()
如果我给view()函数赋负值作为参数会怎样?例如,如果我打电话给我tensor_variable.view(1, 1, -1)怎么办?
tensor_variable.view(1, 1, -1)
谁能view()举例说明功能的主要原理?
视图功能旨在重塑张量。
说你有张量
import torch a = torch.range(1, 16)
a是具有1到16(包括)的16个元素的张量。如果要重塑此张量以使其成为4 x 4张量,则可以使用
a
4 x 4
a = a.view(4, 4)
现在a将是4 x 4张量。 请注意,在重塑后,元素总数必须保持不变。 重塑张a到3 x 5张量是不恰当的。
3 x 5
如果在某些情况下您不知道要多少行,但是确定了列数,则可以将其指定为-1。( 请注意,您可以将其扩展到具有更大尺寸的张量。只有一个轴值可以为-1 )。这是一种告诉库的方法:“给我一个具有这么多列的张量,然后您就可以计算出实现此目的所需的适当行数”。
可以在上面给出的神经网络代码中看到。在x = self.pool(F.relu(self.conv2(x)))前进功能中的线之后,您将具有16深度特征图。您必须将其展平以将其分配给完全连接的层。因此,您告诉pytorch重塑所获得的张量,使其具有特定的列数,并告诉它自己决定行数。
x = self.pool(F.relu(self.conv2(x)))
在numpy和pytorch之间绘制相似之处,view类似于numpy的重塑功能。
view