卷積神經網絡學習


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 在哪里??不明白。

網絡訓練

測試驗證准確率:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM