cs231n 作業2 心路歷程

Assignments 2

作業說明在這裏

Fully-connected Neural Network

今天寫的時候思考了一下爲什麼課件裏寫的都是Wx+bWx+b的形式然而這裏的code寫的都是x * w + b,課件中的x是單張圖片,這種for循環運算batch過於緩慢,故code中x是n組數據。寫的時候就改成了x*w

backward:根據鏈式法則更新梯度,根據要求的shape進行順序調整,轉置,reshape等等

因爲很多網絡都是全連接後面立刻ReLu,所以sandwich layer就是把兩層連在一起,裏面調用剛剛寫的兩層(千萬8要重複實現),嗯,這很軟件工程,這種三明治層可以肆意的定義

然後用這個寫好的各個layer來實現一個兩層的net,作業1已經實現過一次了,這次將其解耦,原來的寫了兩次的全連接,這次直接調用layers裏的就行了,上面剛剛說的三明治層也立刻用上

寫好網絡之後是對solver的介紹,把model和data(劃分好train, val)扔進solver裏,然後solver.train,這裏把每次一邊train一邊val的代碼也寫了,就是作業1後期的很多重複勞動,很贊,偷懶是生產力發展的根本推動力。描述中說要模型練到至少50%,把solver.py中的例子直接複製過來就是52%了,邏輯和作業1中一模一樣,效果也應當是一樣的。感覺代碼一下子變爽了,這個感覺以後一直能用到,tf or torch中並不會有這種solver的code,這種類似的代碼似乎見過不少,api寫的這麼讚的是第一次。從輸出中理解了epoch和Iteration的區別,前者是val loop,後者就是計算loss loop

(2020.2.8 00:32累了,剩下還有一個FullyConnectedNet各種優化方法天亮寫,似乎加上batch_norm和dropout更好寫,明天起來先寫batch_norm然後看課程視頻下一章節寫了dropout再從這裏繼續吧,晚安~)

寫BN寫了一半發現不需要也行,這個依然是多層全聯通網絡,不過更加靈活一點,可以用一個list傳入每層的節點數量(當然層數也隨意)

寫完還有個各種不同的優化器,直接抄公式就行

大頭時間花在調參上(好像也不是很多時間),一開始自己蠢了把學習率寫了個1e-2,一直爆炸,改成1e-3,一發入魂

知乎上搜的調參順序,碼住

Andrew Ng 的個人經驗和偏好是:

第一梯隊: 

- learning rate α

第二梯隊: 

- hidden units                  
- mini-batch size                  
- momentum β

第三梯隊: 
- number of layers                  
- learning rate decay                  
- other optimizer hyperparameters

(2020.2.9 00:20 BN明天寫吧)

JJ 說的調參順序:

  1. learning_rate
  2. reg, learning_rate_decay, model_size

Batch Normalization

講的比較清楚,在線性層和激活層直接的一層,讓數據更穩定.彈幕裏有說,補一些blog和paper再看視頻才能看的比較明白

μ=1Nk=1Nxkσ2=1Nk=1N(xkμ)2x^i=xiμσ2+ϵyi=γx^i+β \begin{aligned} &\boldsymbol{\mu}=\frac{1}{N} \sum_{k=1}^{N} \boldsymbol{x}_{k}\\ &\boldsymbol{\sigma}^{2}=\frac{1}{N} \sum_{k=1}^{N}\left(\boldsymbol{x}_{k}-\boldsymbol{\mu}\right)^{2}\\ &\hat{\boldsymbol{x}}_{i}=\frac{\boldsymbol{x}_{i}-\boldsymbol{\mu}}{\sqrt{\boldsymbol{\sigma}^{2}+\boldsymbol{\epsilon}}}\\ &\boldsymbol{y}_{i}=\gamma \hat{\boldsymbol{x}}_{i}+\beta \end{aligned}

開始連的時候取20條數據練200輪,需要過擬合:排除大部分code bug ?

出現train_acc 增長,val_acc不變或者變差的時候:overfitting,增加reg

(2020.2.8 20:07 我開始了)

axis看了又忘忘了又看,rua

BN真就抄公式唄

sample_mean = np.mean(x, axis=0)
sample_var = np.var(x, axis=0)
z = (x - sample_mean) / np.sqrt(sample_var + eps)
out = gamma * z + beta

至於backward,我選擇死亡,找個抄一下吧死亡1, 死亡2

還要簡化版的backward,高數沒學好,“現在將這三項加在一塊即可得:”

Lxi=γ(σ2+ϵ)1/2N(NLyiLγx^jLβ)\frac{\partial L}{\partial \boldsymbol{x}_{i}}=\frac{\gamma\left(\boldsymbol{\sigma}^{2}+\epsilon\right)^{-1 / 2}}{N}\left(N \frac{\partial L}{\partial \boldsymbol{y}_{i}}-\frac{\partial L}{\partial \gamma} \cdot \hat{\boldsymbol{x}}_{j}-\frac{\partial L}{\partial \beta}\right)

(2020.2.9 00:28 對8起,我還沒睡)

Batch normalization and initialization這裏有確定weight_scale

weight_scales = np.logspace(-4, 0, num=20)在這段區間裏均勻取20個點,然後small_test,後面還有畫圖的,妙啊

一次的batch越大,數據越穩定,當然訓練acc越高,對於val_acc同理,不過因爲驗證集最終會趨於穩定,所以過大不會得到明顯提升,太大反而會導致訓練的很慢,所以,又學到了

另外課裏面講了各種優化方法,好像上學期課上pre剛好就是講的這些內容,隨便聽聽吧=- =

結論就是用Adam,另外當可以full-batch的時候用L-BFGS

Dropout

真就抄公式唄

# train
mask = (np.random.rand(*x.shape) < p)
out = x * mask

# test
out = x

Convolutional Networks

這篇有卷積運算的詳細解釋

然後cnn.py寫的就很起勁

然後卡在了overfit small_data上,我傻了

wq: 學習率太大了,調之,好了,牛逼

PyTorch / TensorFlow on CIFAR-10

if you choose to use that notebook既然如此我就偷懶了,tf以後用到再說

pytorch 共有三個level的api

API Flexibility Convenience
Barebone High Low
nn.Module High Medium
nn.Sequential Low High

似乎平常見到的最多的是 Module level的,舒服,我會了.jpg

最後一個是CIFAR-10 challeage, model = models.resnet18(pretrained=True)哈哈哈哈哈

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