Assignments 2
作業說明在這裏
Fully-connected Neural Network
今天寫的時候思考了一下爲什麼課件裏寫的都是的形式然而這裏的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 說的調參順序:
- learning_rate
- reg, learning_rate_decay, model_size
Batch Normalization
講的比較清楚,在線性層和激活層直接的一層,讓數據更穩定.彈幕裏有說,補一些blog和paper再看視頻才能看的比較明白
開始連的時候取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,高數沒學好,“現在將這三項加在一塊即可得:”
(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)
哈哈哈哈哈