一、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會自動加入激勵函數,
在 net1 中, 激勵函數實際上是在 forward() 功能中才被調用的.
總結
- 使用torch.nn.Module,我們可以根據自己的需求改變傳播過程,如RNN等
- 如果你需要快速建構或者不需要過多的過程,直接使用torch.nn.Sequential即可。
參考:pytorch官方手冊