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
梯度怎麼求,這誰記得住啊?救
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 : )