Part 1 視頻學習心得及問題總結
- 通過對視頻的學習,了解了卷積神經網絡整體的內容和一些思想,卷積神經網絡主要包括卷積,池化,激活函數,損失函數等部分,通過不同的卷積核對數據進行不同的提取,池化對提取的數據進行收縮,減小數據的規模,可能是之前的視頻學習沒看明白,不太理解激活的函數的作用,最后進行損失函數的分析,又反過來修改卷積核等參數,如此不斷進行,使預測更加准確。
- 主要的問題就是不太理解激活函數。
Part2 代碼練習
1. CNN_MNIST
-
MNIST數據集的引入
-
顯示數據集中的部分圖像
-
網絡創建
定義網絡時,需要繼承nn.Module,並實現它的forward方法,把網絡中具有可學習參數的層放在構造函數init中。只要在nn.Module的子類中定義了forward函數,backward函數就會自動被實現(利用autograd)。
-
定義訓練和測試函數
-
在小型全連接網絡上訓練(Fully-connected network)
-
在卷積神經網絡上訓練
需要注意的是,上在定義的CNN和全連接網絡,擁有相同數量的模型參數
通過上面的測試結果,可以發現,含有相同參數的 CNN 效果要明顯優於 簡單的全連接網絡,是因為 CNN 能夠更好的挖掘圖像中的信息,主要通過兩個手段:
- 卷積:Locality and stationarity in images
- 池化:Builds in some translation invariance
打亂像素順序再次在兩個網絡上訓練與測試
考慮到CNN在卷積與池化上的優良特性,如果我們把圖像中的像素打亂順序,這樣 卷積 和 池化 就難以發揮作用了,為了驗證這個想法,我們把圖像中的像素打亂順序再試試。
首先下面代碼展示隨機打亂像素順序后,圖像的形態:
重新定義訓練與測試函數,我們寫了兩個函數 train_perm 和 test_perm,分別對應着加入像素打亂順序的訓練函數與測試函數。
與之前的訓練與測試函數基本上完全相同,只是對 data 加入了打亂順序操作。
在全連接網絡上訓練與測試:
在卷積神經網絡上訓練與測試:
2. CNN_CIFAR10(數據集)
導入數據集並展示一些圖片
定義網絡,損失函數和優化器:
訓練網絡:
現在我們從測試集中取出8張圖片:
我們把圖片輸入模型,看看CNN把這些圖片識別成什么:
可以看到,有幾個都識別錯了~~~ 讓我們看看網絡在整個數據集上的表現:
- 60 多的准確率真的可以嗎??
3. 使用 VGG16 對 CIFAR10 分類
- VGG是由Simonyan 和Zisserman在文獻《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出卷積神經網絡模型,其名稱來源於作者所在的牛津大學視覺幾何組(Visual Geometry Group)的縮寫。該模型參加2014年的 ImageNet圖像分類與定位挑戰賽,取得了優異成績:在分類任務上排名第二,在定位任務上排名第一。
定義 dataloader
VGG 網絡定義
- 這里對代碼進行了小小的改動,是因為后面報錯了,不過問題不大。
- 一個是cfg 報未定義,加一個self 就可以了,已經定義過了。
- 另一個是對nn.Linear 參數的修改,因為后面出現RuntimeError: mat1 and mat2 shapes cannot be multiplied (128x512 and 2048x10)報錯,就把2048改成了512。
初始化網絡,根據實際需要,修改分類層。因為 tiny-imagenet 是對200類圖像分類,這里把輸出修改為200。
- 200 在哪里??不明白。
網絡訓練
測試驗證准確率: