AI入門必讀|Pytorch神經(jīng)網(wǎng)絡(luò)設(shè)計的基本概念綜述
眾所周知,Pytorch是Facebook的AI研究實驗室于2016年開發(fā)的深度學(xué)習(xí)框架。它以面向計算機視覺的應(yīng)用程序而廣為人知,特點是簡單,還有強大的GPU支持,能夠?qū)崿F(xiàn)深度學(xué)習(xí)算法。
本篇文章將會通過示例實現(xiàn)使pytorch更直觀更易懂,將簡單直觀地展示開始構(gòu)建神經(jīng)網(wǎng)絡(luò)之前需要了解的將要用到的知識點。
01?張量
張量是表示多維數(shù)組的Pytorch對象,它類似于NumPy的數(shù)組,為了更好地理解構(gòu)造張量的主要函數(shù),我們同時會用Numpy來舉例,以證明二者的邏輯是相同的。

Numpy和Pytorch使用許多類似的函數(shù)來創(chuàng)建矩陣:
randn 創(chuàng)建隨機矩陣
zeros 構(gòu)建填充零的矩陣
ones 返回矩陣
在構(gòu)建單位矩陣的函數(shù)有一個不同點,就是Pytorch使用該函數(shù)eye,而NumPy使用該函數(shù)identity。




02 矩陣乘法
在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的模型時,有多種矩陣乘法可用,接下來將展示兩種乘法。
在NumPy中,函數(shù)dot和matmul用于兩個矩陣之間的乘積。如果不想使用這些函數(shù),可使用@運算符替代。
Pytorch具有與NumPy中的matmul相同的功能。另一個選擇可以是torch.mm,它們之間的區(qū)別是torch.mm不支持廣播。

在逐元素乘法的情況下,NumPy使用multiply,而Pytorch使用簡單運算符*。

03 從Pytorch到NumPy,反之亦然
numpy數(shù)組可以使用from_numpy函數(shù)轉(zhuǎn)換為張量,相反也可以通過函數(shù)numpy完成。

04 Autograd中的差異化
導(dǎo)數(shù)構(gòu)成神經(jīng)網(wǎng)絡(luò)的基本方面,事實上,梯度下降算法使用導(dǎo)數(shù)來學(xué)習(xí)模型。這個算法的目標是最小化損失函數(shù)J。然后參數(shù)的值會發(fā)生變化,直到我們沒有得到J的最優(yōu)值。這個方法的著名更新規(guī)則是:
w = w - learning rate * dJ(w)/dw
b = b - learning rate * dJ(b)/db
此規(guī)則說明學(xué)習(xí)更快或更慢取決于兩個特點,learning rate和derivative對所考慮的參數(shù)w或b的導(dǎo)數(shù)。這里集中討論導(dǎo)數(shù)的概念。
這是什么意思?
它表示函數(shù)的斜率,當導(dǎo)數(shù)的值很高時,函數(shù)變化很快,而當它接近0時,函數(shù)沒有變化,這可能是神經(jīng)網(wǎng)絡(luò)環(huán)境中學(xué)習(xí)的一個問題。在這個例子中,我比較了一條直線、一條拋物線和一條雙曲線。


與拋物線和雙曲線相比,直線具有較小的導(dǎo)數(shù),而拋物線和雙曲線具有較高的值??梢杂^察到,拋物線的值是直線值的4倍,而雙曲線的值是拋物線值的3倍,所以變化比拋物線快3倍。
05 單層神經(jīng)網(wǎng)絡(luò)
在神經(jīng)網(wǎng)絡(luò)中,數(shù)據(jù)集中的每個特征列都表示為一個輸入神經(jīng)元,而每個加權(quán)值表示為從特征列到輸出神經(jīng)元的箭頭。我們將特征乘以權(quán)重,然后對它們求和,然后添加一個偏差并將其傳遞給激活函數(shù)。這樣,我們就得到了網(wǎng)絡(luò)的輸出。
例如,如果我們有一個一行 10 列的輸入向量,我們將有 10 個神經(jīng)元。

在數(shù)學(xué)上,它看起來像:
z = w? x? + … + w?? x?? + b
y = a(z) = a(w? x? + … + w?? x?? + b)
在代碼中,我通過matmul函數(shù)創(chuàng)建了一個輸入向量,該向量用于從均值為 0 且方差為 1 的正態(tài)分布創(chuàng)建填充隨機數(shù)的矩陣。
加權(quán)矩陣將具有與輸入相同的大小,但具有不同的值。偏差由正態(tài)分布的單個值組成。我們可以使用matmul在輸入和權(quán)重之間進行矩陣乘法,然后我們可以應(yīng)用激活函數(shù)sigm(稱為 sigmoid)來映射 0 和 1 之間的任何值。

代碼返回錯誤。當您訓(xùn)練神經(jīng)網(wǎng)絡(luò)時出現(xiàn)此類錯誤是很常見的。這是因為輸入的列數(shù)不等于 w1 的行數(shù)。為了解決這個問題,我們需要改變權(quán)重的形狀。在 Pytorch 中有三種方法可以做到:
w1.reshape(10,1) 返回一個新的張量,其數(shù)據(jù)與 w1 相同,但形狀為 (10,1)
w1.view(10,1) 返回一個與 w1 具有相同數(shù)據(jù)和不同形狀 (10,1) 的新張量。
w1.resize_(10,1)返回具有不同形狀的相同張量 (10,1)

06 簡單神經(jīng)網(wǎng)絡(luò)
最簡單的神經(jīng)網(wǎng)絡(luò)模型,稱為全連接網(wǎng)絡(luò)。一層中的每個神經(jīng)元都與下一層中的每個神經(jīng)元相連。
下面考慮的架構(gòu)具有一個輸出層、兩個隱藏層和一個輸出層。和以前一樣,我們使用函數(shù) 獲得輸入、權(quán)重和偏差randn。我們不是只對一層進行計算,而是對每一層進行計算。


如何定義一個類,該類定義了 Network 并從nn.Module. 全連接層是通過 構(gòu)建的nn.Linear(in_features,ou_features)。第一個參數(shù)是輸入單元的數(shù)量,而第二個參數(shù)是輸出單元的數(shù)量。

文章中用到的代碼在github:
https://github.com/eugeniaring/Pytorch-tutorial/blob/main/pytorch-for-beginners.ipynb
參考文檔:
https://pub.towardsai.net/pytorch-tutorial-for-beginners-8331afc552c4#c495
如果發(fā)現(xiàn)教程里面有翻譯錯誤問題
可以私聊學(xué)姐指出哈~
有任何學(xué)習(xí)上的問題都
可以來微信公眾號練習(xí)學(xué)姐解決!

點贊轉(zhuǎn)發(fā),鼓勵一下學(xué)姐!