06.09 tensorflow實現CIFAR-10圖片的分類

本篇文章主要是利用tensorflow來構建卷積神經網絡,利用CIFAR-10數據集來實現圖片的分類。數據集主要包括10類不同的圖片,一共有60000張圖片,50000張圖片作為訓練集,10000張圖片作為測試集,每張圖片的大小為32×32×3(彩色圖片)。

tensorflow實現CIFAR-10圖片的分類

在構建CIFAR-10卷積神經網絡中,採用了幾個trick,對權重進行正則化、數據增強、和LRN層來提高模型的性能和泛化能力。

一、下載數據

通過tensorflow官方提供的cifar10來下載CIFAR-10數據

 #下載解壓數據
cifar10.maybe_download_and_extract()

二、權重的正則化

對於權重的初始化,還是採用截斷的正態分佈來隨機初始化卷積和的權重。在權重初始化的時候,會給權重增加一個L2的損失,相當於做了一個L2的正則化處理。在建立模型的時候,無論是迴歸還是分類,都有可能因為特徵過多而導致模型過擬合,通常可以通過減少特徵或者懲罰不重要的特徵的權重來降低模型的過擬合。然而,我們並不知道那些權重是不重要的,通過正則化可以將權重也作為損失函數的一部分,當我們在使用某個特徵的同時也要增加損失函數,如果在增加這個特徵的權重還不足以抵消它帶來的損失,算法就會自動降低這部分特徵的權重來減少損失,這樣我們就能給篩選出重要的特徵。L2正則化會讓權重的值不會太大,趨於0。L1正則化會產生稀疏特徵,即大部分的無用特徵都會被至為0。

下面通過tensorflow來實現對權重的L2正則化,通過設置參數w2來決定特徵帶來損失的大小

tensorflow實現CIFAR-10圖片的分類

三、數據增強

利用工具類cifar10_input來進行數據增強,對32×32的圖片進行隨機裁剪、翻轉、對比度、亮度的設置,裁剪後的圖片由32×32變成了28 ×28,所以後面在設置卷積神經網絡的時候,輸入圖片的大小為28×28×3。在進行數據增強的時候需要消耗大量的CPU,在distorted_inputs內部使用了16個獨立的線程來加速任務,函數內部會產生線程池,在需要使用的時候會通過TensorFlow queue來調度。

在進行測試的時候,通過裁剪圖片的中間部分,將32×32的圖片轉變成為28×28之後才能預測圖片的類別。

tensorflow實現CIFAR-10圖片的分類

四、卷積神經網絡

整個卷積神經網絡主要由兩層卷積層和三層全連接層所組成,最後模型在測試集上的top1準確率可以達到80%。

1、第一層卷積層

第一層卷積是由64個5×5的卷積核組成,步長為1,padding為SAME使得卷積之後的圖片輸入和輸出的大小保持一致。將卷積之後的結果加上偏置,然後在通過RELU激活函數,再經過最大池化,需要注意的是採用的是池化的核為3×3,步長為2×2,池化的尺寸和步長不一致目的是為了增加數據的豐富性。最後再經過Lrn層,LRN層模仿了生物神經系統的“側抑制”機制,對於局部神經元的活動創建競爭環境,使得其中響應較大的值變得更大,並抑制反饋較小的神經元,提高了模型的泛化能力。Relu激活函數是沒有邊界的,所以lrn層對於沒有邊界的激活函數會比較有用,它會從多個卷積核的響應中挑選比較大的反饋。對於有固定邊界且能抑制過大值的激活函數sigmoid不太適應。

tensorflow實現CIFAR-10圖片的分類

2、第二層卷積層

第二層卷積與第一層卷積的總體結構相差不大,相對於第一層卷積,第二層將lrn層和最大池化層的順序進行了調換,先通過lrn層之後,再使用最大池化。

tensorflow實現CIFAR-10圖片的分類

3、第三層全連接層

在進行全連接操作之前,需要先將卷積後的圖片進行flatten,將圖片變成一個行向量,一行代表一張圖片,所有有bath_size行。在這一層全連接中對權重使用L2正則化,正則化的係數為0.004。通過relu激活函數之後輸出一個384維的向量。

tensorflow實現CIFAR-10圖片的分類

4、第四層全連接層

這一層全連接層和上一層差不多,將輸入的384維向量變成了192維向量的輸出,也使用了L2正則化。

tensorflow實現CIFAR-10圖片的分類

5、第五層全連接層

這一層將192維的向量轉變為10維向量的輸出,代表著十個不同種類的圖片,輸出的並沒有經過softmax。

tensorflow實現CIFAR-10圖片的分類

6、損失函數的計算

使用交叉熵作為損失函數,在這裡我們通過sparse_softmax_cross_entropy_with_logits來實現softmax和交叉熵的計算。最後還需要加上之前的權重的損失作為最後總的損失函數進行優化。

tensorflow實現CIFAR-10圖片的分類

7、訓練和預測

在訓練的過程中,會輸出每秒能夠處理多少圖片,每迭代1000次輸出一次損失值。需要注意的是,在進行預測的時候需要將測試集分成一塊一塊batch_size大小的圖片進行預測,統計top1準確率,最後計算出top1的平均值,top1是指分類準確率最高的那類圖片。

tensorflow實現CIFAR-10圖片的分類

迭代10000次後的準確率可以達到80%,如果還想提高準確率,可以增加迭代的次數,然後在降低學習率。

代碼完整鏈接:https://github.com/steelOneself/tensorflow_learn/blob/master/CIFAR_10/CNNCIFAR10.py


分享到:


相關文章: