首页 > 解决方案 > 我们的性能和准确性是否比不使用 `pytorch.nn.Sequnetial` 时更低,如果是,为什么?

问题描述

我正在查看这个视频,Phil 指出,使用torch.nn.Sequential比不使用要快。我做了快速谷歌,发现这篇文章没有得到满意的回答,所以我在这里复制它。

这是帖子中的代码Sequential

class net2(nn.Module):
    def __init__(self):
        super(net2, self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv2d(
                in_channels=1,
                out_channels=16,
                kernel_size=5,
                stride=1,
                padding=2,
            ),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2),
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(16, 32, 5, 1, 2),
            nn.ReLU(),
            nn.MaxPool2d(2),
        )
        self.out = nn.Linear(32 * 7 * 7, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = x.view(x.size(0), -1)
        output = self.out(x)
        return output

这是没有的网络Sequential

class net1(nn.Module):
    def __init__(self):
        super(net1, self).__init__()
        self.conv1 = nn.Conv2d(1,16,5,1,2)
        self.conv2 = nn.Conv2d(16,32,5,1,2)
        self.pool1 = nn.MaxPool2d(2)
        self.pool2 = nn.MaxPool2d(2)
        self.fc1 = nn.Linear(32*7*7,10)

    def forward(self, x):
        out = F.relu(self.conv1(x))
        out = self.pool1(out)
        out = F.relu(self.conv2(out))
        out = self.pool2(out)

        out = out.view(-1,32*7*7)
        out = F.relu(self.fc1(out))
        return out

在评论中,作者还指出,有它的准确性Sequential比没有它的要好。其中一条评论指出速度更快,Sequential因为循环展开会导致更快的执行。所以这是我的相关问题:

  1. Sequntial循环展开是实现比另一个更快的唯一原因吗?

  2. 有人可以解释一下 non- 如何Sequential不会导致循环展开并Sequntial导致循环展开,也许可以通过将我指向github 上的 pytorch 源代码行

  3. Sequential真的会导致更高的准确性,如果是,为什么?

标签: pythonmachine-learningneural-networkpytorch

解决方案


请注意,这两种架构是不同的。一个在输出之前有一个 ReLU ( net1, F.relu(self.fc1(out))),另一个没有 ( net2, self.out(x))。这可能解释了为什么一个具有与另一个不同的准确性。

关于速度,我认为应该没有任何区别。ReLU 的速度通常可以忽略不计。鉴于您没有说明速度差异,很难说可能是什么原因。


推荐阅读