卷积神经网络(CNN,ConvNet)
卷積神經(jīng)網(wǎng)絡(luò)(CNN,ConvNet)
卷積神經(jīng)網(wǎng)絡(luò)(CNN,有時(shí)被稱為 ConvNet)是很吸引人的。在短時(shí)間內(nèi),變成了一種顛覆性的技術(shù),打破了從文本、視頻到語(yǔ)音等多個(gè)領(lǐng)域所有最先進(jìn)的算法,遠(yuǎn)遠(yuǎn)超出了其最初在圖像處理的應(yīng)用范圍。
CNN 由許多神經(jīng)網(wǎng)絡(luò)層組成。卷積和池化這兩種不同類型的層通常是交替的。網(wǎng)絡(luò)中每個(gè)濾波器的深度從左到右增加。最后通常由一個(gè)或多個(gè)全連接的層組成:
圖 1 卷積神經(jīng)網(wǎng)絡(luò)的一個(gè)例子
Convnets 背后有三個(gè)關(guān)鍵動(dòng)機(jī):局部感受野、共享權(quán)重和池化。
局部感受野
如果想保留圖像中的空間信息,那么用像素矩陣表示每個(gè)圖像是很方便的。然后,編碼局部結(jié)構(gòu),將相鄰輸入神經(jīng)元的子矩陣連接成屬于下一層的單隱藏層神經(jīng)元。這個(gè)單隱藏層神經(jīng)元代表一個(gè)局部感受野。請(qǐng)注意,此操作名為“卷積”,此類網(wǎng)絡(luò)也因此而得名。
當(dāng)然,可以通過(guò)重疊的子矩陣來(lái)編碼更多的信息。例如,假設(shè)每個(gè)子矩陣的大小是 5×5,并且將這些子矩陣應(yīng)用到 28×28 像素的 MNIST 圖像。然后,就能夠在下一隱藏層中生成 23×23 的局部感受野。事實(shí)上,在觸及圖像的邊界之前,只需要滑動(dòng)子矩陣 23 個(gè)位置。
定義從一層到另一層的特征圖。當(dāng)然,可以有多個(gè)獨(dú)立從每個(gè)隱藏層學(xué)習(xí)的特征映射。例如,可以從 28×28 輸入神經(jīng)元開(kāi)始處理 MNIST 圖像,然后(還是以 5×5 的步幅)在下一個(gè)隱藏層中得到每個(gè)大小為 23×23 的神經(jīng)元的 k 個(gè)特征圖。
共享權(quán)重和偏置
假設(shè)想要從原始像素表示中,獲得移除與輸入圖像中位置信息無(wú)關(guān)的相同特征的能力。一個(gè)簡(jiǎn)單的直覺(jué)就是,對(duì)隱藏層中的所有神經(jīng)元使用相同的權(quán)重和偏置。通過(guò)這種方式,每層將從圖像中學(xué)習(xí)到獨(dú)立于位置信息的潛在特征。
理解卷積的一個(gè)簡(jiǎn)單方法是,考慮作用于矩陣的滑動(dòng)窗函數(shù)。在下面的例子中,給定輸入矩陣 I 和核 K,得到卷積輸出。將 3×3 核 K(有時(shí)稱為濾波器或特征檢測(cè)器)與輸入矩陣逐元素地相乘,以得到輸出卷積矩陣中的一個(gè)元素。所有其他元素都是通過(guò)在 I 上滑動(dòng)窗口獲得的:
圖 2 卷積運(yùn)算的一個(gè)例子:用粗體表示參與計(jì)算的單元
在這個(gè)例子中,一觸及 I 的邊界就停止滑動(dòng)窗口(所以輸出是 3×3)。或者,可以選擇用零填充輸入(以便輸出為 5×5),這是有關(guān)填充的選擇。
另一個(gè)選擇是,關(guān)于滑窗所采用的滑動(dòng)方式的步幅。步幅可以是 1 或大于 1。大步幅意味著,核的應(yīng)用更少,以及更小的輸出尺寸,而小步幅產(chǎn)生更多的輸出并保留更多的信息。
濾波器的大小、步幅和填充類型是超參數(shù),可以在訓(xùn)練網(wǎng)絡(luò)時(shí)進(jìn)行微調(diào)。
TensorFlow中的ConvNet
在 TensorFlow 中,如果想添加一個(gè)卷積層,可以這樣寫(xiě):
參數(shù)說(shuō)明如下:
? input:張量,必須是 half、float32、float64 三種類型之一。
? filter:張量必須具有與輸入相同的類型。
? strides:整數(shù)列表。長(zhǎng)度是 4 的一維向量。輸入的每一維度的滑動(dòng)窗口步幅。必須與指定格式維度的順序相同。
? padding:可選字符串為 SAME、VALID。要使用的填充算法的類型。
? use_cudnn_on_gpu:一個(gè)可選的布爾值,默認(rèn)為 True。
? data_format:可選字符串為 NHWC、NCHW,默認(rèn)為 NHWC。指定輸入和輸出數(shù)據(jù)的數(shù)據(jù)格式。使用默認(rèn)格式 NHWC,數(shù)據(jù)按照以下順序存儲(chǔ):[batch,in_height,in_width,in_channels]。或者,格式可以是 NCHW,數(shù)據(jù)存儲(chǔ)順序?yàn)?#xff1a;[batch,in_channels,in_height,in_width]。
? name:操作的名稱(可選)。
下圖提供了一個(gè)卷積的例子:
圖 3 卷積運(yùn)算的例子
池化層
假設(shè)要總結(jié)一個(gè)特征映射的輸出。可以使用從單個(gè)特征映射產(chǎn)生的輸出的空間鄰接性,并將子矩陣的值聚合成單個(gè)輸出值,從而合成地描述與該物理區(qū)域相關(guān)聯(lián)的含義。
最大池化
一個(gè)簡(jiǎn)單而通用的選擇是所謂的最大池化算子,輸出在區(qū)域中觀察到的最大輸入值。在 TensorFlow 中,如果想要定義一個(gè)大小為 2×2 的最大池化層,可以這樣寫(xiě):
參數(shù)說(shuō)明如下:
? value:形狀為 [batch,height,width,channels] 和類型是 tf.float32 的四維張量。
? ksize:長(zhǎng)度 >=4 的整數(shù)列表。輸入張量的每個(gè)維度的窗口大小。
? strides:長(zhǎng)度 >=4 的整數(shù)列表。輸入張量的每個(gè)維度的滑動(dòng)窗口的步幅。
? padding:一個(gè)字符串,可以是 VALID 或 SAME。
? data_format:一個(gè)字符串,支持 NHWC 和 NCHW。
? name:操作的可選名稱。
下圖給出了最大池化操作的示例:
圖 4 池化操作的一個(gè)例子
平均池化
另一個(gè)選擇是平均池化,它簡(jiǎn)單地將一個(gè)區(qū)域聚合成在該區(qū)域觀察到的輸入值的平均值。
TensorFlow 可以實(shí)現(xiàn)大量的池化層,并在線提供了一個(gè)完整的列表(https://www.tensorflow.org/api_guides/python/nn#Pooling)。總之,所有池化操作不過(guò)是給定區(qū)域的匯總操作。
ConvNet總結(jié)
CNN 基本上是幾層具有非線性激活函數(shù)的卷積,以及將池化層應(yīng)用于卷積的結(jié)果。每層應(yīng)用不同的濾波器(成百上千個(gè))。理解的關(guān)鍵是濾波器不是預(yù)先設(shè)定好的,而是在訓(xùn)練階段學(xué)習(xí)的,以使得恰當(dāng)?shù)膿p失函數(shù)被最小化。已經(jīng)觀察到,較低層會(huì)學(xué)習(xí)檢測(cè)基本特征,而較高層檢測(cè)更復(fù)雜的特征,例如形狀或面部。
由于有池化層,靠后的層中的神經(jīng)元看到的更多的是原始圖像,因此,能夠編輯前幾層中學(xué)習(xí)的基本特征。
到目前為止,描述了 ConvNet 的基本概念。CNN 在時(shí)間維度上對(duì)音頻和文本數(shù)據(jù)進(jìn)行一維卷積和池化操作,沿(高度×寬度)維度對(duì)圖像進(jìn)行二維處理,沿(高度×寬度×?xí)r間)維度對(duì)視頻進(jìn)行三維處理。對(duì)于圖像,在輸入上滑動(dòng)濾波器會(huì)生成一個(gè)特征圖,為每個(gè)空間位置提供濾波器的響應(yīng)。
換句話說(shuō),一個(gè) ConvNet 由多個(gè)濾波器堆疊在一起,學(xué)習(xí)識(shí)別在圖像中獨(dú)立于位置信息的具體視覺(jué)特征。這些視覺(jué)特征在網(wǎng)絡(luò)的前面幾層很簡(jiǎn)單,然后隨著網(wǎng)絡(luò)的加深,組合成更加復(fù)雜的全局特征。
總結(jié)
以上是生活随笔為你收集整理的卷积神经网络(CNN,ConvNet)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TensorFlow Keras API
- 下一篇: 3层-CNN卷积神经网络预测MNIST数