一、nn.Sequential
torch.nn.Sequential是一个Sequential容器,模块将按照构造函数中传递的顺序添加到模块中。另外,也可以传入一个有序模块。 为了更容易理解,官方给出了一些案例:
# Sequential使用实例 model = nn.Sequential( nn.Conv2d(1,20,5), nn.ReLU(), nn.Conv2d(20,64,5), nn.ReLU() ) # Sequential with OrderedDict使用实例 model = nn.Sequential(OrderedDict([ ('conv1', nn.Conv2d(1,20,5)), ('relu1', nn.ReLU()), ('conv2', nn.Conv2d(20,64,5)), ('relu2', nn.ReLU()) ]))
二、nn.Module
下面我们再用 Module 定义这个模型,下面是使用 Module 的模板
class 网络名字(nn.Module): def __init__(self, 一些定义的参数): super(网络名字, self).__init__() self.layer1 = nn.Linear(num_input, num_hidden) self.layer2 = nn.Sequential(...) ... 定义需要用的网络层 def forward(self, x): # 定义前向传播 x1 = self.layer1(x) x2 = self.layer2(x) x = x1 + x2 ... return x
注意的是,Module 里面也可以使用 Sequential,同时 Module 非常灵活,具体体现在 forward 中,如何复杂的操作都能直观的在 forward 里面执行
三、对比
为了方便比较,我们先用普通方法搭建一个神经网络。
class Net(torch.nn.Module): def __init__(self, n_feature, n_hidden, n_output): super(Net, self).__init__() self.hidden = torch.nn.Linear(n_feature, n_hidden) self.predict = torch.nn.Linear(n_hidden, n_output) def forward(self, x): x = F.relu(self.hidden(x)) x = self.predict(x) return x net1 = Net(1, 10, 1) net2 = torch.nn.Sequential( torch.nn.Linear(1, 10), torch.nn.ReLU(), torch.nn.Linear(10, 1) )
打印这两个net
print(net1) """ Net ( (hidden): Linear (1 -> 10) (predict): Linear (10 -> 1) ) """ print(net2) """ Sequential ( (0): Linear (1 -> 10) (1): ReLU () (2): Linear (10 -> 1) ) """
解析源码,在torch.nn.Sequential中:
def forward(self, input): for module in self: input = module(input) return input
可以看到,torch.nn.Sequential的forward只是简单的顺序传播,操作性有限.
总结
- 使用torch.nn.Module,我们可以根据自己的需求改变传播过程,如RNN等
- 如果你需要快速构建或者不需要过多的过程,直接使用torch.nn.Sequential即可。
参考:pytorch官方手册
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225249.html原文链接:https://javaforall.net
