softmax手動實現(xiàn)+詳細注釋(動手學(xué)深度學(xué)習(xí)筆記)

訓(xùn)練結(jié)果(20個epoch 學(xué)習(xí)率0.1)

可以看出在10epoch的時候就基本開始過擬合了
過于硬核的手動實現(xiàn)
由于李沐老師的softmax手動實現(xiàn)部分較為硬核,自己剛?cè)腴T不久啃起來有些麻煩,過程中嘗試自己寫時也踩了不少坑,因此加了十分詳盡的注釋,幫助大家一起理解代碼,共同學(xué)習(xí)!
此外還重寫了一些方法,沒有使用到老師的d2l庫,個人感覺主要難點還是將python語法與算法實現(xiàn)相結(jié)合,一方面關(guān)注算法本身的邏輯,另一方面也要注意如何使用python實現(xiàn)
老師的代碼封裝的比較好,但很多地方的實現(xiàn)過于抽象,需要深入理解
讀取數(shù)據(jù)集并創(chuàng)建dataloader
展平圖像與初始化參數(shù)
視為28*28=784的向量,故輸入是784,由于數(shù)據(jù)集有10個類別,所以網(wǎng)絡(luò)輸出維度是10
定義softmax算符
這里要掌握張量計算的方法
當調(diào)?sum運算符時,我們可以指定保持在原始張量的軸數(shù),?不折疊求和的維度,如對(3,2)進行按列求和,會得到(2,),設(shè)置keepdim為True就是(1,2)即一行,分別是兩列的和
定義模型
1. 例如batch_size=256,則X這里是(256,784)代表256張圖片 每個圖片有28x28個像素(被展平成784)
2. 權(quán)重矩陣為(784,10)代表對每種輸出的各特征權(quán)重
3. 因此256x784@784x10==256x10 即每張圖片會輸出十個類別的置信度,如衣服20% T恤60%……大衣5%,對十個輸出會加上一個bias,通過廣播機制作用到所有圖片
定義交叉熵損失
交叉熵只在意真實值的預(yù)測概率,因此這里是抽取每一行對應(yīng)是真實類別的預(yù)測概率的那個值,拿出來求負對數(shù)
例如第一個樣本應(yīng)該是2類(設(shè)共三類,從0-2),并預(yù)測概率是0.7,第二個樣本應(yīng)該是1類,預(yù)測是1類概率為0.5,則交叉熵損失為
計算accuracy
(accuracy無法作為損失函數(shù)所以我們引入交叉熵,但最后還是通過accuracy來看我們預(yù)測如何)
1. argmin/argmax 可以指定axis 返回最小或最大元素的索引下標(從0開始)
2. type 更改張量的dtype類型
3. sum將True相加(因為True代表1,求和相當于計算是True的個數(shù))
評估在任意模型上的準確率
回歸訓(xùn)練
分類預(yù)測
結(jié)果
最后
后續(xù)會考慮邊跟老師課多發(fā)筆記,希望可以降低大家debug的時間,和大家共同進步!