使用autograd可實現深度學習模型,但其抽象程度較低,如果用其來實現深度學習模型,則需要編寫的代碼量極大。在這種情況下,torch.nn應運而生,其是專門爲深度學習而設計的模塊。torch.nn的核心數據結構是Module
,它是一個抽象概念,既可以表示神經網絡中的某個層(layer),也可以表示一個包含很多層的神經網絡。在實際使用中,最常見的做法是繼承nn.Module
,撰寫自己的網絡/層。
全連接層的實現非常簡單,其代碼量不超過10行,但需注意以下幾點:
- 自定義層
Linear
必須繼承nn.Module
,並且在其構造函數中需調用nn.Module
的構造函數,即super(Linear, self).__init__()
或nn.Module.__init__(self)
,推薦使用第一種用法,儘管第二種寫法更直觀。 - 在構造函數
__init__
中必須自己定義可學習的參數,並封裝成Parameter
,如在本例中我們把w
和b
封裝成parameter
。parameter
是一種特殊的Tensor
,但其默認需要求導(requires_grad = True),感興趣的讀者可以通過nn.Parameter??
,查看Parameter
類的源代碼。 forward
函數實現前向傳播過程,其輸入可以是一個或多個tensor。- 無需寫反向傳播函數,nn.Module能夠利用autograd自動實現反向傳播,這點比Function簡單許多。
- 使用時,直觀上可將layer看成數學概念中的函數,調用layer(input)即可得到input對應的結果。它等價於
layers.__call__(input)
,在__call__
函數中,主要調用的是layer.forward(x)
,另外還對鉤子做了一些處理。所以在實際使用中應儘量使用layer(x)
而不是使用layer.forward(x)
,關於鉤子技術將在下文講解。 Module
中的可學習參數可以通過named_parameters()
或者parameters()
返回迭代器,前者會給每個parameter都附上名字,使其更具有辨識度。
可見利用Module實現的全連接層,比利用Function
實現的更爲簡單,因其不再需要寫反向傳播函數。
Module能夠自動檢測到自己的Parameter
,並將其作爲學習參數。除了parameter
之外,Module還包含子Module
,主Module能夠遞歸查找子Module
中的parameter
。下面再來看看稍微複雜一點的網絡,多層感知機。