天天看點

nn.Sequential和nn.Module差別與選擇一、nn.Sequential二、nn.Module三、對比

一、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官方手冊

繼續閱讀