python - 我们的性能和准确性是否比不使用 `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
因为循环展开会导致更快的执行。所以这是我的相关问题:
Sequntial
循环展开是实现比另一个更快的唯一原因吗?有人可以解释一下 non- 如何
Sequential
不会导致循环展开并Sequntial
导致循环展开,也许可以通过将我指向github 上的 pytorch 源代码行Sequential
真的会导致更高的准确性,如果是,为什么?
解决方案
请注意,这两种架构是不同的。一个在输出之前有一个 ReLU ( net1
, F.relu(self.fc1(out))
),另一个没有 ( net2
, self.out(x)
)。这可能解释了为什么一个具有与另一个不同的准确性。
关于速度,我认为应该没有任何区别。ReLU 的速度通常可以忽略不计。鉴于您没有说明速度差异,很难说可能是什么原因。
推荐阅读
- sql - SQL SELECT 列值基于值
- google-analytics - 虚拟页面查看问题 -datalayer- GTM
- python - arduino上的Python,输入等待进程完成
- python - 当我在 tkinter 中单击按钮两次时,避免标签显示两次
- reactjs - 使用 redux-observable 实现背压
- angular - 如何在全局角度项目中设置默认时区?
- python - 将数据帧与具有来自第一个数据帧的常量值的另一个数据帧合并
- r - 将多个类别识别的字符/字符串转换为单独的字符串
- neo4j - 如何在密码中包含失败的匹配值
- ruby - 如何解决“retrieve_values”问题