此前我們用大量篇幅討論了神經網絡背后的數學原理,現在到了把理論變成代碼的時候。這個新系列將一步步教你如何在PyTorch里搭建真正的網絡——從最基本的模塊開始,邊寫邊理解。
不過,在動手之前有個現實要先說明:AI輔助編程工具確實能飛快生成代碼,但同樣也能悄悄刪掉關鍵邏輯、改動執行順序、埋進隱蔽錯誤——這一切都不會主動告訴你,往往要到線上出問題才會發現。一位開發者為此寫了git-lrc,一個能掛載到git commit上的審查工具,每次提交前自動檢查每個diff,60秒就能配好,完全免費。項目已在GitHub開源,歡迎反饋和貢獻,順手可以給顆星。
![]()
好了,回到正題。本文需要的模塊很簡單,一共四個。
第一個是torch本身——用來創建張量。神經網絡里所有數值數據都存在張量中,包括原始輸入、權重和偏差。你可能會問為什么不用NumPy數組?因為張量能直接跑在GPU上,這對訓練速度至關重要。
第二個是torch.nn,導入時通常簡寫為nn。這個模塊幫你定義和搭建網絡的各個組件,還能讓權重和偏差自動注冊為網絡的一部分,省去手動追蹤這些參數的麻煩。記住:任何你想讓優化器自動更新的參數,都要通過nn來管理。
第三個是torch.nn.functional,習慣上簡寫為F。別被名字迷惑——它和nn模塊是互補關系。F提供的是無狀態的函數,比如各種激活函數(ReLU、sigmoid等)和其他常用操作。當你只需要執行一次計算而不需要保存參數時,用F最合適。
第四個是從torch.optim中導入的SGD。SGD全稱隨機梯度下降,是讓網絡擬合數據的關鍵優化算法。每次迭代它都會計算損失對每個參數的梯度,然后按照學習率調整參數值,讓網絡逐步逼近最優解。
現在到了真正搭建網絡的部分。PyTorch創建神經網絡的標準做法是寫一個類。比如這樣聲明:class MyBasicNN(nn.Module)。
注意這個類繼承自nn.Module——這是整個PyTorch框架的核心基類。一旦繼承,你的類就自動獲得了作為神經網絡應有的全部能力:參數追蹤、序列化保存、設備遷移(CPU和GPU之間),以及最重要的forward方法的分發機制。沒有這個繼承關系,你的類就是一堆普通計算,PyTorch根本不知道該怎么優化它。
繼承之后下一步是寫初始化方法。每個網絡類都需要一個__init__函數作為構造器。在構造器里,第一件事必須調用super().__init__()——這條語句觸發父類nn.Module的初始化流程。
跳過這一步會怎樣?網絡看起來能跑,但內部的注冊表、鉤子函數、參數管理機制全都沒正確建立。后續訓練時你會發現參數不被追蹤、save和load失效、甚至梯度計算都不完整。所以這個調用不是可有可無的儀式,而是真實的基建工作。
再往下走,按理說應該開始定義權重和偏差了。但這引出一個先決問題:我們需要先知道要解決什么具體問題,才能確定網絡的結構。是全連接還是卷積?輸入輸出維度各是多少?幾層隱藏層?每個隱藏層多大?這些選擇都取決于數據本身。
所以這篇先停在這里。下一篇我們會引入一個具體的例子問題,然后基于問題需求,在構造器里初始化對應的權重和偏差,完成第一個完整可訓練的網絡。把基座搭對,后續才能跑得穩,這個順序很重要。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.