本次做業:Andrew Ng的CNN的搭建卷積神經網絡模型以及應用(1&2)做業目錄參考這位博主的整理:https://blog.csdn.net/u013733326/article/details/79827273git
今天要實現的是識別手勢姿式表達的數字github
個人Git傳送門:https://github.com/VVV-LHY/deeplearning.ai/tree/master/CNN/RecognizeGestureNum編程
原本是接着day17用了numpy編了一個卷積層和池化層的前向傳播,而後後向傳播更麻煩了,Andrew Ng的課上也開始用tensorflow和kears了。因此我開始用pytorch完成CNN的編程做業,可是由於Andrew的例子和裏面加載數據全用的tensorflow,我決定發揮主觀能動性,本身轉化pytorch框架。(史前巨坑,由於沒用過pytorch,昨天到今天碰見好多天坑)數組
1.pytorch的默認圖片處理順序網絡
NxCxHxW 意思是通道C在前面,咱們之前的作法是numpy和其餘默認讀法channel在最後面,因此須要下面的方法:數據結構
np的array數組有一個transpose方法,好比:架構
原來的通道是a = (N,H,W,C)框架
轉化 a = a.transpose(0, 3, 1, 2)意思是N不變,C從第三個換到第二個,W和C分別後移一位函數
新的 a = (N, C, H, W)url
2.torchvision包裏面的dataset和dataloader
前者是把數據和標籤合爲dataset而且能夠返回長度、還能夠在方法裏面轉換Tensor,還能夠壓縮(0,255)爲(0,1)用torchvision.transfroms,能夠看官方文檔有不少方法
dataloader能夠加載dataset而且作mini batch的處理 shuffle洗牌等等
可是dataset須要本身重構類裏面的方法,具體能夠自行搜索。
3.損失函數報錯的問題
multi-target not supported at /opt/conda/conda-bld/pytorch_1556653114079/wor
緣由是你loss_func的標籤label的維度不對,須要的是tensor的行向量
yourlabel.squeeze(1)
注意必定要是1,0就變成列向量了。
plus:差很少新手錯誤全是在數據結構上面,由於神經網絡的架構只要一層一層算好(n+2p-kernel_size / s) + 1是絕對不會出錯的,再難再大的網絡畫張圖寫好參數也不可能錯
可是對於沒有用過張量的直接從numpy轉來的新手可能會由於一些方法的不一樣在數據結構上屢屢出錯,因此從載入數據開始就要清楚每一次操做對於數據自己的shape或者size有什麼影響。