卷积神经网络(CNN)详解及TensorFlow2代码实现
卷積神經(jīng)網(wǎng)絡(luò)名字聽(tīng)著挺嚇人,本文用通俗易懂的方式解釋。人人都能看懂。
文章目錄
- 卷積是什么
- 一、卷積神經(jīng)網(wǎng)絡(luò)介紹
- 卷積層--提取局部圖片特征
- 擴(kuò)充--padding,保持卷積后圖片的長(zhǎng)和寬保持不變
- 池化層---降低維度,降低模型復(fù)雜度和計(jì)算量
- flatten展平--讓多維數(shù)據(jù)變成一個(gè)巨大的一維向量
- 全連接層--輸出結(jié)果
- 二、TensorFlow2代碼實(shí)現(xiàn)
- 1.導(dǎo)入數(shù)據(jù)
- 2.用TensorFlow2構(gòu)建一個(gè)CNN網(wǎng)絡(luò)
- 總結(jié)
卷積是什么
卷積神經(jīng)網(wǎng)絡(luò)就是傳統(tǒng)神經(jīng)網(wǎng)絡(luò)運(yùn)用了矩陣卷積的技術(shù)。
二維線性卷積:
矩陣舉例:
(部分內(nèi)容摘抄自此文)
現(xiàn)在有一張圖片(下圖左) 和一個(gè)kernel核(下圖中間)。通過(guò)卷積可以得到下圖右的結(jié)果。
我們知道,圖片實(shí)際上就是一個(gè)巨大的數(shù)值矩陣,也就是我們常說(shuō)的像素。一張灰色圖片就是一個(gè)巨大的二維矩陣,矩陣中每個(gè)元素表示黑白的程度,可以理解為就是一個(gè)數(shù)學(xué)矩陣。
二維卷積:從二維矩陣中拿到第一個(gè)值,即圖示中的標(biāo)紅框1,1所在的位置對(duì)上卷積核kernel 中心位置,即圖示中的紅色框(卷積核就是一個(gè)矩陣),對(duì)應(yīng)位置的值與矩陣元素相乘最后求和,得到的值便是新的值-8(計(jì)算方法見(jiàn)上文矩陣求卷積運(yùn)算),以此類推,取得所有位置的新值,最后圖片的最外層填上0就可以了。二維卷積得到的大小取決與卷積核,而卷積核大小一般是奇數(shù)大小(例3×3, 5×5),表示取像素值取決周圍一圈的像素值,取決的權(quán)重由卷積核決定,提取該區(qū)域特定特征。
一、卷積神經(jīng)網(wǎng)絡(luò)介紹
卷積神經(jīng)網(wǎng)絡(luò)(CNN)可用于使機(jī)器可視化事物并執(zhí)行諸如圖像分類,圖像識(shí)別,對(duì)象檢測(cè),實(shí)例分割等任務(wù)。這是CNN最常見(jiàn)的領(lǐng)域,如字跡識(shí)別等。
卷積層–提取局部圖片特征
圖片有RGB三個(gè)顏色通道,因此輸入是3層,由于3個(gè)輸入通道(紅色R,綠色G和藍(lán)色B),我們看到的任何圖像都是3通道圖像??梢岳斫鉃?層,因此卷積核也是3層,相當(dāng)于兩個(gè)3*3的魔方對(duì)應(yīng)的9個(gè)元素相乘,最后9個(gè)乘積相加。因此,卷積核相當(dāng)于使用3層二維(長(zhǎng)和寬)過(guò)濾器,圖像的通道數(shù)(層數(shù))和過(guò)濾器層數(shù)相同。
與2D卷積操作類似,我們將在水平方向上滑動(dòng)過(guò)濾器。每次移動(dòng)過(guò)濾器時(shí),我們都將獲取整個(gè)圖片三個(gè)通道(3層)的加權(quán)平均值,即RGB值的加權(quán)鄰域。由于我們僅在兩個(gè)維度上滑動(dòng)內(nèi)核-從左到右,從上到下,此操作的輸出將是2D輸出。
假設(shè)我們有大小為7x7的2D輸入,并且正在從圖像的左上角開(kāi)始在圖像上應(yīng)用3x3的濾鏡。當(dāng)我們從左到右,從上到下在圖像上滑動(dòng)內(nèi)核時(shí),很明顯,輸出小于輸入,即5x5。
如果我們希望輸出與輸入大小相同怎么辦?
如果原始輸入的大小為7x7,我們也希望輸出大小為7x7。因此,在那種情況下,我們可以做的是在輸入周圍均勻添加一個(gè)人工填充(值為零),這樣我們就可以將過(guò)濾器K(3x3)放置在圖像像素點(diǎn)上,并計(jì)算鄰居的加權(quán)平均值。
一個(gè)卷積核就是提取一個(gè)特征,因此,為了充分提取圖片的特征,我們需要多個(gè)卷積核對(duì)圖片進(jìn)行特征提取,這就叫卷積核的深度,得到的結(jié)果就是多個(gè)2D輸出,堆疊在一起,就有多層輸出。如圖:
理解了這個(gè)圖,才能理解最后那個(gè)卷積神經(jīng)網(wǎng)絡(luò)的架構(gòu)圖。多層卷積會(huì)導(dǎo)致這種彩色的層數(shù)增加。
擴(kuò)充–padding,保持卷積后圖片的長(zhǎng)和寬保持不變
通過(guò)在輸入周圍添加一圈(零)這種人工填充,我們可以將輸出的形狀與輸入保持相同。如果我們有一個(gè)更大的過(guò)濾器K(5x5),那么我們需要應(yīng)用零填充的數(shù)量也會(huì)增加,這樣我們就可以保持相同的輸出大小。在此過(guò)程中,輸出的大小與輸出的大小相同,因此命名為Padding。原文見(jiàn)此鏈接
池化層—降低維度,降低模型復(fù)雜度和計(jì)算量
獲得了特征圖,通常我們將執(zhí)行一個(gè)稱為Pooling operation的操作。由于學(xué)習(xí)圖像中存在的復(fù)雜關(guān)系所需的隱藏層數(shù)將很大。我們應(yīng)用池化操作來(lái)減少輸入特征的表示,從而降低網(wǎng)絡(luò)所需的計(jì)算能力。
一旦獲得輸入的特征圖,我們將在特征圖上應(yīng)用確定形狀的過(guò)濾器,以從特征圖的該部分獲得最大值。這稱為最大池化。這也稱為子采樣,因?yàn)閺膬?nèi)核覆蓋的特征圖的整個(gè)部分中,我們正在對(duì)一個(gè)最大值進(jìn)行采樣。
flatten展平–讓多維數(shù)據(jù)變成一個(gè)巨大的一維向量
我們得到了多個(gè)粉色的卷積結(jié)果,是個(gè)多維的,如卷積層那節(jié)最后的那個(gè)圖所示。
可是我們預(yù)測(cè)的結(jié)果是一維的,比如二分類,不是0就是1,多維的數(shù)據(jù)怎么得到一維的輸出呢?
簡(jiǎn)單嘛,把多維的數(shù)據(jù)全部攤平,成一個(gè)一維的數(shù)組,就像你把很多個(gè)魔方,一個(gè)個(gè)的掰下來(lái),排成一排。魔方就是多維的啊,你不就是把多個(gè)多維的數(shù)組,變成一維的數(shù)組了嗎?
全連接層–輸出結(jié)果
一旦我們對(duì)圖像的特征表示進(jìn)行了一系列的卷積和pooling操作(最大合并或平均合并,也稱下采樣)。我們將最終池化層的輸出展平為一個(gè)向量,并將其通過(guò)具有不同數(shù)量隱藏層的全連接層(前饋神經(jīng)網(wǎng)絡(luò))傳遞,最后經(jīng)過(guò)多層的深度神經(jīng)網(wǎng)絡(luò)進(jìn)行擬合。
最后,完全連接層的輸出將通過(guò)所需大小的Softmax層。Softmax層輸出概率分布的向量,這有助于執(zhí)行圖像分類任務(wù)。在數(shù)字識(shí)別器問(wèn)題(如上所示)中,輸出softmax層具有10個(gè)神經(jīng)元,可將輸入分類為10個(gè)類別之一(0–9個(gè)數(shù)字)。如果是個(gè)二分類問(wèn)題,則Softmax層就是2個(gè)神經(jīng)元,分別輸出0,1,所以最后的Softmax層是根據(jù)最終結(jié)果需要分多少類來(lái)確定的。
如果是2分類,最后那個(gè)softmax成就是只有兩個(gè)神經(jīng)元,表示2類輸出。
二、TensorFlow2代碼實(shí)現(xiàn)
1.導(dǎo)入數(shù)據(jù)
我們用TensorFlow2自帶的mnist測(cè)試手寫(xiě)的0-9數(shù)字,然后判定他具體寫(xiě)的是哪個(gè)數(shù)字。
向?qū)霐?shù)據(jù),新建一個(gè)MNISTLoader的類。
代碼如下(命名為testData.py):
2.用TensorFlow2構(gòu)建一個(gè)CNN網(wǎng)絡(luò)
代碼結(jié)構(gòu)如下:
1、定義超參數(shù)
2、定于模型結(jié)構(gòu)
3、對(duì)模型進(jìn)行訓(xùn)練
4、預(yù)測(cè)測(cè)試集并測(cè)試準(zhǔn)確度
運(yùn)行的預(yù)測(cè)準(zhǔn)確率能達(dá)到99.15%。太不可思議了。
輸出結(jié)果:
總結(jié)
搭建一個(gè)卷積神經(jīng)網(wǎng)絡(luò)只需要滿足:確定層數(shù)、按照卷積、激活、池化等流程定義每一層、層與層之間輸入輸出匹配,要輸出結(jié)果,就需要把2維甚至多維的矩陣展平成一個(gè)大的1維矩陣,然后用全連接又可以構(gòu)建輸出端的多層神經(jīng)網(wǎng)絡(luò),最后輸出的那層用到了softmax函數(shù)進(jìn)行分類,輸出的概率最大的那個(gè)結(jié)果,就是我們的預(yù)測(cè)結(jié)果。
因此實(shí)現(xiàn)一個(gè)卷積神經(jīng)網(wǎng)絡(luò)的搭建。準(zhǔn)確率已經(jīng)相當(dāng)不錯(cuò)了。
總結(jié)
以上是生活随笔為你收集整理的卷积神经网络(CNN)详解及TensorFlow2代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据挖掘的11大算法及python实现(
- 下一篇: 深度学习之基于卷积神经网络实现服装图像识