小编典典

PyTorch 中的“视图”方法是如何工作的?

all

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()作用?我在很多地方都看到过它的用法,但我不明白它是如何解释它的参数的。

如果我将负值作为view()函数的参数,会发生什么?例如,如果我打电话,会发生什么tensor_variable.view(1, 1, -1)

谁能view()用一些例子来解释功能的主要原理?


阅读 74

收藏
2022-04-25

共1个答案

小编典典

视图函数旨在重塑张量。

假设你有一个张量

import torch
a = torch.range(1, 16)

a是一个张量,有 16 个元素,从 1 到 16(包括在内)。如果您想重塑此张量以使其成为4 x 4张量,则可以使用

a = a.view(4, 4)

现在a将是一个4 x 4张量。 请注意,在重塑之后,元素的总数需要保持不变。 将张量重塑为张a3 x 5是不合适的。

参数-1是什么意思?

如果在任何情况下您不知道需要多少行但确定列数,则可以使用 -1 指定。( 请注意,您可以将其扩展到具有更多维度的张量。只有一个轴值可以是 -1
)。这是告诉库的一种方式:“给我一个包含这么多列的张量,然后计算实现这一点所需的适当行数”。

这可以在您上面给出的神经网络代码中看到。在 forward 函数中的行之后x = self.pool(F.relu(self.conv2(x))),你将有一个 16 深度的特征图。您必须将其展平以将其提供给全连接层。因此,您告诉
pytorch 将获得的张量重塑为具有特定列数,并告诉它自己决定行数。

绘制一个numpy和pytorch的相似之处,view类似于numpy的reshape函数。

2022-04-25