好久不見各位親們,從上半年畢業(yè)到現(xiàn)在各方面開始步入正常軌跡,也開始有時間寫點文章了,后續(xù)開始陸續(xù)更新關(guān)于自然語言處理相關(guān)技術(shù)、論文等,感謝各位老鐵這么長時間的關(guān)注和支持,我會再接再厲認(rèn)真寫文以饗讀者,也感謝各位提出的建議,共同交流,不吝賜教,fighting!
前言
眾所周知,卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)通常是被用在圖像識別領(lǐng)域的,其實還可以應(yīng)用于語音識別,文本分類等多個領(lǐng)域。寫這篇文章主要是為了介紹TextCnn文本分類模型,當(dāng)然也會詳細(xì)介紹CNN的具體內(nèi)容,并輔以相關(guān)的案例。當(dāng)然,這里默認(rèn)讀者對神經(jīng)網(wǎng)絡(luò)有一定的了解和認(rèn)識,如果有疑問可留言,本文也不介紹太多關(guān)于數(shù)學(xué)的內(nèi)容,以便于讀者理解,如有需要后期更新相關(guān)數(shù)學(xué)推導(dǎo)。
1 卷積神經(jīng)網(wǎng)絡(luò)簡介
通常有:
數(shù)據(jù)輸入層/ Input layer
卷積計算層/ CONV layer
池化層 / Pooling layer
全連接層 / FullConnect layer
輸出層 / Output layer
當(dāng)然也還包括神經(jīng)網(wǎng)絡(luò)常用的激活層,正則化層等。
模型訓(xùn)練完畢后,對圖像分類的主要過程如下:
CNN處理流程
當(dāng)然,我們的主要工作還是構(gòu)建CNN模型以及使用相關(guān)數(shù)據(jù)進(jìn)行模型訓(xùn)練,以使得模型能夠提取數(shù)據(jù)特征進(jìn)行更好的分類。下面就對各個層以及神經(jīng)網(wǎng)絡(luò)的核心模塊進(jìn)行介紹。
2 卷積層
卷積層是卷積神經(jīng)網(wǎng)絡(luò)的核心層,核心的處理方式就是卷積(Convolution)計算。卷積其實也就可以看成一個函數(shù)或者一種算法。這個函數(shù)則需要輸入數(shù)據(jù)和卷積核,按照卷積要求進(jìn)行計算。我們可以通過下面的圖形簡單理解一下,假設(shè)我們有一個5x5的矩陣和一個3x3的卷積核(進(jìn)行卷積計算所需要的兩個參數(shù)),如下:
輸入矩陣和卷積核
卷積核就是從輸入矩陣從左到右,從上到下進(jìn)行計算,計算過程如下:
卷積計算過程
輸入矩陣對應(yīng)的虛線框體大小就是卷積核形狀的大小,然后虛線框?qū)?yīng)元素與卷積核中的對應(yīng)元素相乘求和就得出結(jié)果4。然后虛線框向右移一個單位(后面還會用到)計算第二個值,然后再移動一個單位計算第三個值,那么第一行就計算完畢了。需要注意的是,虛線框的大小要與卷積核形狀大小保持一致。同理可計算第二行,如下:
卷積計算過程2
一次類推計算出所有結(jié)果。經(jīng)過卷積計算的結(jié)果就是一個3x3的矩陣。總結(jié)一句話就是移動窗口,對應(yīng)值計算相加即可。
可以看出,卷積層其實是提取圖像特征的過程。另外深思一下:擺在我們面前的問題有:卷積核如何確定?卷積核為啥只移動一個單位?移動過程超出邊界不可以嗎?
2.1 卷積核
卷積核在圖像識別中也稱過濾器。比較簡單的過濾器有:Horizontalfilter、Verticalfilter、Sobel Filter等。這些過濾器能夠檢測圖像的水平邊緣、垂直邊緣、增強圖像區(qū)域權(quán)重等,這里不做細(xì)致探究。其實,過濾器的作用類似于標(biāo)準(zhǔn)(例如全連接層)的權(quán)重矩陣W,需要通過梯度下降算法反復(fù)迭代求得。而卷積神經(jīng)網(wǎng)絡(luò)的主要目的就是計算出這些卷積核。
2.2 步幅
在前面的計算中可以看出,通過向右,向下移動一個單位的卷積核大小的窗口計算得到卷積結(jié)果。其實這個卷積核大小的窗口向右,向下移動的格數(shù)(單位)成為步幅(strides),上面每次移動一格,那么對應(yīng)的strides就為1。在圖像處理中就是跳過像素的個數(shù)了。這個步幅也不是固定不變就是1,可結(jié)合實際場景改變。并且在移動的過程中,卷積核中的值不變是共享的。這也就大大降低了參數(shù)的數(shù)量。
2.3 填充
從上面的計算結(jié)果可以看出,輸入是一個5x5的矩陣,經(jīng)過卷積核計算后,輸出就變成了3x3的結(jié)果。如果你想再次輸入大小為5x5的矩陣怎么辦?這時我們就需要對原始輸入的5x5大小的矩陣做一下處理——填充(padding),在擴展區(qū)域補0。根據(jù)之前計算過程,只要向右向下各多移動兩次即可得到5x5的計算結(jié)果,那么對輸入矩陣補齊得到如下結(jié)果:
填充
現(xiàn)在結(jié)合輸入矩陣大小n、卷積核大小f、padding(補0圈數(shù))計算輸出矩陣大小p、步幅大小為s,公式如下:
當(dāng)然這里默認(rèn)輸入的數(shù)據(jù)長寬一致,如果長寬不同,則需根據(jù)具體情況具體分析。
拓展:實際中的圖片是三通道的,即:RGB通道,而對于視頻又會多個幀數(shù)通道。其實多通道時,每個通道對應(yīng)一個卷積核即可。
2.4 激活函數(shù)
為了保證對數(shù)據(jù)非線性處理,也需要激活函數(shù),也就是激活層的處理。其處理方式是,為卷積核的每個元素添加一個bias(偏移值),然后送入諸如relu、leakyRelu、tanh等非線性激活函數(shù)即可。
3 池化層
在經(jīng)過卷積層之后,其實就可以通過全連接層后接softmax進(jìn)行分類輸出圖片類別了,但是這個時候,數(shù)據(jù)量依然是特別大的,也就面臨著巨大的計算量挑戰(zhàn)。池化(Pooling)又稱下采樣,可以進(jìn)一步降低網(wǎng)絡(luò)訓(xùn)練參數(shù)和模型過擬合的程度。
常用的池化處理有一下幾種:
最大池化(Max Pooling):選擇Pooling窗口中的最大值作為采樣值
均值池化(Mean Pooling):將Pooling窗口中的所有值加起來取平均,使用平均值作為采樣值
全局最大(或均值)池化:取整個特征圖的最大值或均值
假如我們有如下提取特征的結(jié)果值:
以及假定池化的窗口大小為2x2,步幅為1,那么幾種池化過程如下:
簡單池化
池化層在cnn中可用來較小尺寸,提高運算速度及減小噪聲影響,讓各特征更具健壯性。
4 全連接層和輸出層
這部分主要連接最后池化后的結(jié)果,將池化后的數(shù)據(jù)展平構(gòu)成全連接層的輸入。然后就是根據(jù)類別數(shù)構(gòu)建的一個分類層,也就是輸出層,對于分類任務(wù)輸出層則添加一個sigmoid層計算需要分類的圖片各個類別的概率。對于訓(xùn)練任務(wù),則使用損失函數(shù)開始反向傳播更新模型中的卷積核。
總結(jié)
卷積神經(jīng)網(wǎng)絡(luò)的大致流程如此,實際中則需要靈活多變。卷積神經(jīng)網(wǎng)絡(luò)發(fā)展非常迅速,相關(guān)技術(shù)比較成熟,應(yīng)用也比較廣泛。比較有代表性性的模型有:
LeNet-5
AlexNet
VGG
GoogleNet
ResNet
膠囊網(wǎng)絡(luò)
對此感興趣的可以深入了解。下面一篇文章將結(jié)合Pytorch以及CIFAR-10數(shù)據(jù)集做一個利用卷積神經(jīng)網(wǎng)絡(luò)分類的任務(wù),以夯實對卷積神經(jīng)網(wǎng)絡(luò)的理解以及Pytorch的熟練使用。
原文標(biāo)題:【深度學(xué)習(xí)】卷積神經(jīng)網(wǎng)絡(luò)-CNN簡單理論介紹
文章出處:【微信公眾號:自然語言處理愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責(zé)任編輯:haq
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4771瀏覽量
100719 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5500瀏覽量
121113 -
cnn
+關(guān)注
關(guān)注
3文章
352瀏覽量
22204
原文標(biāo)題:【深度學(xué)習(xí)】卷積神經(jīng)網(wǎng)絡(luò)-CNN簡單理論介紹
文章出處:【微信號:NLP_lover,微信公眾號:自然語言處理愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論