cs231n 作業1 心路歷程

cs231n Assignment 1 cww note

做cs231n的作業的一個心路歷程,不會重複別人寫好的材料,別人寫的數學分析,代碼,比我高到不知道哪裏去了

We are here

這也是一門經典的課程了,網上材料一堆,在自己很菜的情況下不上網查是不可能的,查了哪些引用了哪些我直接鏈接過去,這裏記錄自己的探索過程,並沒有什麼閱讀價值~

KNN

在cs231-lec2中講解了這個很粗暴的算法:比較兩張圖片的每一個像素作爲distance,對於每一個測試選取訓練集中與之dist最小的。

比較有意思的是裏面計算距離矩陣的三種方法, two_loops, one_loop, no_loop, 完全平方公式還有python中的broadcast比較有意思,還是能學到東西的。

最後的交叉驗證,之前在博哥的ML課上做過。所以就skip了

趕緊看模態融合啊,先鴿了,明天之後再寫這個。(2019.12.16)

SVM

梯度怎麼求,這誰記得住啊?救

回憶SVM的loss

scores = X[i].dot(W)

注意到這裏是X[i] 在前,W在後,X的shape是(500, 3073),那麼X[i]便是一個長度爲3073的行向量,而W是(3073, 10)。

第i張圖片在第j個分類的得分只與W的第j列有關,所以當margin > 0即有loss的時候,需要調整W使錯誤分類的得分變低,使正確分類的得分變高。

這裏的分析可以看出,對於W的這一列,直接求偏導,對第j列就是X[i],對第y[i](正確標籤)列就是-X[i](求偏導就當求導,多看兩遍,我數學這麼爛都看懂了)

不過對於最後的正則化項爲什麼要這麼寫我還是很疑惑的dW += 2 * reg * W老陳問號.jpg

沒有循環的矩陣運算有點騷,看溼了。

寫完兩個loss還有train和predict的代碼要寫,其實比前面的好寫多了,因爲不用算梯度

learning_rates = [1e-7, 5e-5] # 第二個lr要加一個小數點才能收斂,不然就炸了

調了半天以爲前面code寫錯了,學習率過大導致每一步都跑過了,然後loss爆炸,再加一個小數點就好了,感覺這個lr寫這是故意讓人理解的

softmax

主要看了這裏和原來的課件,卡的地方還是求梯度的過程

val過程其實和前面很像,我好菜啊

two_layer_net

兩層的全聯通網絡,激活函數在第一層maximum(H, 0),scores很好算,loss可以直接抄softmax的,算梯度數學太差逃了,抄這裏

另外需要完成train和predict兩個函數,和linear_classifier差不多,複製過來該一些變量就行(這個不涉及數學,一點都不慌)

toy_data和toy_model真的是調試神器,而且寫一小段就有一個check點不要太舒服,那麼問題來了,自己寫這種東西的時候check數據哪來呢

“Tweaking hyperparameters by hand can be fun”那麼現在調參都一天試一組參數?這個for循環寫的感覺有點奢侈啊,而且超參啥的感覺都是xjb寫,調參玄學?遇到再說吧,感覺現在自己的功力還沒到調參這一步就死掉了

features

前面是直接把圖片像素直接扔進模型裏,這一個part是首先提取出圖片的feature然後把feature作爲model的輸入訓練

要寫的代碼就是直接的調參,複製過來改一下參數,feature計算比像素點小很多,自然速度快很多

注意到NN的最好的一組超參達到了60%的準確率,題面描述的最佳效果,頭禿了一晚上這個時候感覺最爽

Summary

第一次作業使用numpy實現了KNN, SVM, softmax, 兩層全聯通網絡,還有設計圖像feature然後調參訓練

說是實現其實擡舉自己了,本來的代碼寫的非常優雅,讀起來賞心悅目。只要在挖空的地方填上loss, train, predict之類的就好

數學菜的扣腳,各種梯度不會算,往回翻了課件最後還是跌跌撞撞網上各種抄才寫完模型裏的代碼,我靠numpy真騷

不過正兒八經上戰場應該還是cuda()吧,沒能完全靠自己寫完這些code,至少也都認真讀了一遍,調參過程倒是熟練

多認識了不少超參,實實在在理解了這幾個模型,至少以後別人問到自己不會一問三不知了,ok,下一課

學校要三月開學了,被困在農村裏,這一個晚上的效率感覺是過去一週,不,一個月的總和,希望狀態能保持

希望早日能見到夏天的陽光,夏天的YOUNG : )

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章