我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是一个张量,有 16 个元素,从 1 到 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 )。这是告诉库的一种方式:“给我一个包含这么多列的张量,然后计算实现这一点所需的适当行数”。
这可以在您上面给出的神经网络代码中看到。在 forward 函数中的行之后x = self.pool(F.relu(self.conv2(x))),你将有一个 16 深度的特征图。您必须将其展平以将其提供给全连接层。因此,您告诉 pytorch 将获得的张量重塑为具有特定列数,并告诉它自己决定行数。
x = self.pool(F.relu(self.conv2(x)))
绘制一个numpy和pytorch的相似之处,view类似于numpy的reshape函数。
view