- 機器學習系統:設計和實現
- 麥絡 董豪編著
- 987字
- 2024-12-27 20:30:20
2.3.2 神經網絡層的實現原理
2.3.1節中使用偽代碼定義了一些卷積神經網絡接口和模型構建過程,整個模型構建過程需要創建訓練變量和構建連接過程。隨著網絡層數的增加,手動管理訓練變量是一個煩瑣的過程,因此2.3.1節中描述的接口在機器學習庫中屬于低級API。機器學習編程庫大都提供了更高級用戶友好的API,它將神經網絡層抽象出一個基類,所有的神經網絡層都繼承基類實現。如MindSpore提供的mindspore.nn.Cell,PyTorch提供的torch.nn.Module。基于基類它們都提供了高階API,如MindSpore提供的mindspore.nn.Conv2d、mindspore.nn.MaxPool2d、mindspore.dataset;PyTorch提供的torch.nn.Conv2d、torch.nn.MaxPool2d、torch.utils.data.Dataset。
圖2.9描述了神經網絡模型構建過程中的基本細節。神經網絡層需要初始化訓練參數、管理參數狀態以及定義計算過程;神經網絡模型需要實現對神經網絡層和神經網絡層參數管理的功能。在機器學習編程庫中,承擔此功能有MindSpore的Cell類和PyTorch的Module類。Cell和Module是模型抽象方法,也是所有網絡的基類。現有模型抽象方案有兩種:一種是抽象出兩個方法,分別為Layer(負責單個神經網絡層的參數構建和前向計算),Model(負責對神經網絡層進行連接組合和神經網絡層參數管理);另一種是將Layer和Model抽象成一個方法,該方法既能表示單層神經網絡層,也能表示包含多個神經網絡層堆疊的模型,Cell和Module就是這樣實現的。

圖2.9 神經網絡模型構建細節
圖2.10展示了設計神經網絡基類抽象方法的通用表示。通常在構造器會選擇使用Python中collections模塊的OrderedDict方法存儲初始化神經網絡層和神經網絡層參數。它的輸出是有序的,相比與無序的Dict方法更適合深度學習這種模型堆疊的模式。參數和神經網絡層的管理是在__setattr__方法中實現的,當檢測到屬性是屬于神經網絡層及神經網絡層參數時就記錄起來。神經網絡模型比較重要的是計算連接過程,可以在__call__方法中重載,實現神經網絡層時在這里定義計算過程。訓練參數的返回接口是為了給優化器傳送所有訓練參數,這些參數是基類遍歷了所有網絡層后得到的。這里只列出了一些重要的方法,在自定義方法中,通常需要實現參數插入與刪除方法、神經網絡層插入與刪除、神經網絡模型信息等。

圖2.10 神經網絡基類抽象方法
神經網絡接口層基類的實現,這里僅做了簡化的描述,在實際實現時,執行計算的_call_方法并不會讓用戶直接重載,它往往在__call__方法之外,定義一個執行操作的方法(該方法對于神經網絡模型是實現網絡結構的連接,對于神經網絡層則是實現計算過程),然后通過__call__方法調用;如MindSpore的Cell因為動態圖和靜態圖的執行是不一樣的,因此在__call__方法中定義動態圖和計算圖的計算執行,在construct方法中定義層或者模型的操作過程。
- 數據科學實戰手冊(R+Python)
- JavaScript從入門到精通(微視頻精編版)
- Vue.js 2 and Bootstrap 4 Web Development
- Python程序設計(第3版)
- 從程序員到架構師:大數據量、緩存、高并發、微服務、多團隊協同等核心場景實戰
- 匯編語言程序設計(第3版)
- Visual C#.NET程序設計
- Mastering Android Development with Kotlin
- ANSYS Fluent 二次開發指南
- Mastering C++ Multithreading
- Hands-On GUI Programming with C++ and Qt5
- Kubernetes進階實戰
- OpenCV Android Programming By Example
- Python Web自動化測試設計與實現
- 基于GPU加速的計算機視覺編程:使用OpenCV和CUDA實時處理復雜圖像數據