神經網絡工具箱nn

使用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,如在本例中我們把wb封裝成parameterparameter是一種特殊的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。下面再來看看稍微複雜一點的網絡,多層感知機。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章