官术网_书友最值得收藏!

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方法中定義層或者模型的操作過程。

主站蜘蛛池模板: 柘荣县| 马山县| 和平区| 安西县| 调兵山市| 建阳市| 凌云县| 建德市| 兴隆县| 正宁县| 阳朔县| 临汾市| 台东县| 广西| 清水县| 施甸县| 和顺县| 峨眉山市| 万年县| 桓仁| 揭东县| 青河县| 胶州市| 千阳县| 务川| 宁德市| 札达县| 庆城县| 正蓝旗| 金沙县| 博客| 镇赉县| 治县。| 吴堡县| 余姚市| 宜章县| 宜都市| 兴城市| 新蔡县| 广东省| 六盘水市|