丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給AI研習(xí)社
發(fā)送

0

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

本文作者: AI研習(xí)社 編輯:賈智龍 2017-07-25 15:12
導(dǎo)語:本文講的是Kaggle經(jīng)典的CIFAR圖像分類問題。

雷鋒網(wǎng)按:本文原作者天雨粟,原文載于作者的知乎專欄——機器不學(xué)習(xí),雷鋒網(wǎng)經(jīng)授權(quán)發(fā)布。

前言

在上一篇專欄中,我們利用卷積自編碼器對 MNIST 數(shù)據(jù)進行了實驗,這周我們來看一個 Kaggle 上比較經(jīng)典的一個圖像分類的比賽 CIFAR( CIFAR-10 - Object Recognition in Images ),這個比賽現(xiàn)在已經(jīng)關(guān)閉了,但不妨礙我們來去通過它學(xué)習(xí)一下卷積神經(jīng)網(wǎng)絡(luò)做圖像識別的代碼結(jié)構(gòu)。相信很多學(xué)過深度學(xué)習(xí)的同學(xué)都嘗試過這個比賽,如果對此比較熟悉的可以跳過本篇,如果沒有嘗試過的同學(xué)可以來學(xué)習(xí)一下哈。

整個代碼已經(jīng)放在了我的 GitHub 上,建議可以把代碼 pull 下來,邊看文章邊看代碼。

GitHub 地址:NELSONZHAO/zhihu

如果覺得有幫助,麻煩點個 star 啦~

介紹

文章主要分為兩個部分,第一部分我們將通過一個簡單的 KNN 來實現(xiàn)圖像的分類,第二部分我們通過卷積神經(jīng)網(wǎng)絡(luò)提升整個圖像分類的性能。

第一部分

提到圖像分類,我們可能會想到傳統(tǒng)機器學(xué)習(xí)中 KNN 算法,通過找到當前待分類圖像的 K 個近鄰,以近鄰的類別判斷當前圖像的類別。

由于我們的圖像實際上是由一個一個像素組成的,因此每一個圖像可以看做是一個向量,那么我們此時就可以來計算向量(圖片)之間的距離。比如,我們的圖片如果是 32x32 像素的,那么可以展開成一個 1x1024 的向量,就可以計算這些向量間的 L1 或者 L2 距離,找到它們的近鄰,從而根據(jù)近鄰的類別來判斷圖像的類別。

以下例子中 K=5。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

下面我們就來用 scikit-learn 實現(xiàn)以下 KNN 對圖像的分類。

首先我們需要下載數(shù)據(jù)文件,網(wǎng)址為 https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 。我們數(shù)據(jù)包含了 60000 萬圖片,每張圖片的維度為 32 x 32 x 3,這些圖片都有各自的標注,一共分為了以下十類:

  • airplane

  • automobile

  • bird

  • cat

  • deer

  • dog

  • frog

  • horse

  • ship

  • truck

數(shù)據(jù)是被序列化以后存儲的,因此我們需要使用 Python 中的 pickle 包將它們讀進來。整個壓縮包解壓以后,會有 5 個 data_batch 和 1 個 test_batch。我們首先把數(shù)據(jù)加載進來:

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

我們定義了一個函數(shù)來獲取 batch 中的 features 和 labels,通過上面的步驟,我們就可以獲得 train 數(shù)據(jù)與 test 數(shù)據(jù)。

我們的每個圖片的維度是 32 x 32 x 3,其中 3 代表 RGB。我們先來看一些這些圖片長什么樣子。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

每張圖片的像素其實很低,縮小以后我們可以看到圖片中有汽車,馬,飛機等。

構(gòu)造好了我們的 x_train, y_train, x_test 以及 y_test 以后,我們就可以開始建模過程。在將圖片扔進模型之前,我們首先要對數(shù)據(jù)進行預(yù)處理,包括重塑和歸一化兩步,首先將 32 x 32 x 3 轉(zhuǎn)化為一個 3072 維的向量,再對數(shù)據(jù)進行歸一化,歸一化的目的在于計算距離時保證各個維度的量綱一致。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

到此為止,我們已經(jīng)對數(shù)據(jù)進行了預(yù)處理,下面就可以調(diào)用 KNN 來進行訓(xùn)練,我分別采用了 K=1,3,5 來看模型的效果。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

從 KNN 的分類準確率來看,是要比我們隨機猜測類別提高了不少。我們隨機猜測圖片類別時,準確率大概是 10%,KNN 方式的圖片分類可以將準確率提高到 35% 左右。當然有興趣的小伙伴還可以去測試一下其他的 K 值,同時在上面的算法中,默認距離衡量方式是歐式距離,還可以嘗試其他度量距離來進行建模。

雖然 KNN 在 test 數(shù)據(jù)集上表現(xiàn)有所提升,但是這個準確率還是太低了。除此之外,KNN 有一個缺點,就是所有的計算時間都在 predict 階段,當一個新的圖來的時候,涉及到大量的距離計算,這就意味著一旦我們要拿它來進行圖像識別,那可能要等非常久才能拿到結(jié)果,而且還不是那么的準。


第二部分

在上一部分,我們用了非常簡單的 KNN 思想實現(xiàn)了圖像分類。在這個部分,我們將通過卷積神經(jīng)網(wǎng)絡(luò)來實現(xiàn)一個更加準確、高效的模型。

加載數(shù)據(jù)的過程與上一部分相同,不再贅述。當我們將數(shù)據(jù)加載完畢后,首先要做以下三件事:

  • 對輸入數(shù)據(jù)歸一化

  • 對標簽進行 one-hot 編碼

  • 構(gòu)造訓(xùn)練集,驗證集和測試集

對輸入數(shù)據(jù)歸一化

在這里我們使用 sklearn 中的 minmax 歸一化。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

首先將訓(xùn)練數(shù)據(jù)集重塑為 [50000, 3072] 的形狀,利用 minmax 來進行歸一化。最后再將圖像重塑回原來的形狀。

對標簽進行 one-hot 編碼

同樣我們在這里使用 sklearn 中的 LabelBinarizer 來進行 one-hot 編碼。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

構(gòu)造 train 和 val

目前我們已經(jīng)有了 train 和 test 數(shù)據(jù)集,接下來我們要將加載進來的 train 分成訓(xùn)練集和驗證集。從而在訓(xùn)練過程中觀察驗證集的結(jié)果。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

我們將訓(xùn)練數(shù)據(jù)集按照 8:2 分為 train 和 validation。

卷積網(wǎng)絡(luò)

完成了數(shù)據(jù)的預(yù)處理,我們接下來就要開始進行建模。

首先我們把一些重要的參數(shù)設(shè)置好,并且將輸入和標簽 tensor 構(gòu)造好。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

img_shape 是整個訓(xùn)練集的形狀,為 [40000, 32, 32, 3],同時我們的輸入形狀是 [batch_size, 32, 32, 3],由于前面我們已經(jīng)對標簽進行了 one-hot 編碼,因此標簽是一個 [batch_size, 10] 的 tensor。

接下來我們先來看一下整個卷積網(wǎng)絡(luò)的結(jié)構(gòu):

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

在這里我設(shè)置了兩層卷積 + 兩層全連接層的結(jié)構(gòu),大家也可以嘗試其他不同的結(jié)構(gòu)和參數(shù)。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

conv2d 中我自己定義了初始化權(quán)重為 truncated_normal,事實證明權(quán)重初始化對于卷積結(jié)果有一定的影響。

在這里,我們來說一下 conv2d 的參數(shù):

  • 輸入 tensor:inputs_

  • 濾波器的數(shù)量:64

  • 濾波器的 size:height=2, width=2, depth 默認與 inputs_的 depth 相同

  • strides:strides 默認為 1x1,因此在這里我沒有重新設(shè)置 strides

  • padding:padding 我選了 same,在 strides 是 1 的情況下,經(jīng)過卷積以后 height 和 width 與原圖保持一致

  • kernel_initializer:濾波器的初始化權(quán)重

在這里講一下卷積函數(shù)中的兩種常見 padding 方式,分別是 valid,same。假設(shè)我們輸入圖片長和寬均為 h,filter 的 size 為 k x k,strides 為 s x s,padding 大小 = p。當 padding=valid 時,經(jīng)過卷積以后的圖片新的長(或?qū)挘?用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類! ;當 padding=same 時,經(jīng)過卷積以后 用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類! 。但在 TensorFlow 中的實現(xiàn)與這里有所區(qū)別,在 TensorFlow 中,當 padding=valid 時, 用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類! ;當 padding=same 時, 用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

其余參數(shù)類似,這里不再贅述,如果還不是很清楚的小伙伴可以去查看官方文檔。

在第一個全連接層中我加入了 dropout 正則化防止過擬合,同時加快訓(xùn)練速度。

訓(xùn)練模型

完成了模型的構(gòu)建,下面我們就來開始訓(xùn)練整個模型。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

在訓(xùn)練過程中,每 100 輪打印一次日志,顯示出當前 train loss 和 validation 上的準確率。

我們來看一下最終的訓(xùn)練結(jié)果:

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

上圖是我之前跑的一次結(jié)果,這次跑出來可能有所出入,但準確率大概會在 65%-70% 之間。

最后在 validation 上的準確率大約穩(wěn)定在了 70% 左右,我們接下來看一下在 test 數(shù)據(jù)上的準確率。下面的代碼是在 test 測試準確率的代碼。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

我們把訓(xùn)練結(jié)果加載進來,設(shè)置 test 的 batchs_size 為 100,來測試我們的訓(xùn)練結(jié)果。最終我們的測試準確率也基本在 70% 左右。

總結(jié)

至此,我們實現(xiàn)了兩種圖像分類的算法。第一種是 KNN,它的思想非常好理解,但缺點在于計算量都集中在測試階段,訓(xùn)練階段的計算量幾乎為 0,另外,它的準確性也非常差。第二種我們利用 CNN 實現(xiàn)了分類,最終的測試結(jié)果大約在 70% 左右,相比 KNN 的 30% 準確率,它的分類效果表現(xiàn)的相當好。當然,如果想要繼續(xù)提升模型的準確率,就需要采用其他的一些手段,如果感興趣的小伙伴可以去看一下相關(guān)鏈接(http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html#43494641522d3130) 里的技巧,Kaggle 上的第一名準確率已經(jīng)超過了 95%。

如果覺得有用,請記得給 GitHub 打一個 Star,非常感謝!

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

用 Kaggle 經(jīng)典案例教你用 CNN 做圖像分類!

分享:
相關(guān)文章

編輯

聚焦數(shù)據(jù)科學(xué),連接 AI 開發(fā)者。更多精彩內(nèi)容,請訪問:yanxishe.com
當月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說