什么是CNN?寫(xiě)給小白的機(jī)器學(xué)習(xí)入門(mén)貼,F(xiàn)acebook員工打造,47k訪問(wèn)量
卷積神經(jīng)網(wǎng)絡(luò)(CNN),從識(shí)別數(shù)字開(kāi)始
白交 發(fā)自 凹非寺
量子位 報(bào)道 | 公眾號(hào) QbitAI
看你是人還是物,是貓還是狗。
卷積神經(jīng)網(wǎng)絡(luò)(CNN)最重要的用途就是圖像分類(lèi)。說(shuō)起來(lái),似乎很簡(jiǎn)單。
為什么不使用普通的神經(jīng)網(wǎng)絡(luò)呢?
那是因?yàn)樵趫D像分類(lèi)時(shí),面臨著圖像大,物體的形態(tài)、位置不同等問(wèn)題,這就給普通的神經(jīng)網(wǎng)絡(luò)帶來(lái)了難題。
而,卷積神經(jīng)網(wǎng)絡(luò)就是來(lái)解決這個(gè)問(wèn)題。
Facebook軟件工程師Victor Zhou這篇入門(mén)貼,就介紹了什么是卷積神經(jīng)網(wǎng)絡(luò)。
截至目前,已經(jīng)有47k訪問(wèn)量了。
已經(jīng)對(duì)神經(jīng)網(wǎng)絡(luò)有所了解的同學(xué),一起來(lái)看看吧。
MNIST手寫(xiě)數(shù)字分類(lèi)
首先,就以MNIST手寫(xiě)數(shù)字分類(lèi)為例,這就是MNIST數(shù)據(jù)集的樣本。
很簡(jiǎn)單,就是識(shí)別圖像,然后將其分類(lèi)為數(shù)字。
MNIST數(shù)據(jù)集中的每個(gè)圖像均為28×28,我們看到,都是居中的灰度數(shù)字。
正常的神經(jīng)網(wǎng)絡(luò)其實(shí)就可以解決這個(gè)問(wèn)題,首先將每張圖像視為28×28=784維向量,將784維送到一個(gè)784維的輸入層,堆疊幾個(gè)隱藏層,然后用10個(gè)節(jié)點(diǎn)的輸出層來(lái)完成,每個(gè)數(shù)字1個(gè)節(jié)點(diǎn)。
但這些數(shù)字居中,且圖像較小,所以也就沒(méi)有尺寸大、位置偏移的問(wèn)題。但是我們知道實(shí)際生活中,情況并非如此。
好了,有了一個(gè)基本的了解之后,我們就進(jìn)入了這個(gè)卷積神經(jīng)網(wǎng)絡(luò)的世界吧。
什么是卷積神經(jīng)網(wǎng)絡(luò)?
顧名思義,卷積神經(jīng)網(wǎng)絡(luò)就是基本上只是由卷積層組成的神經(jīng)網(wǎng)絡(luò),卷積層是基于卷積的數(shù)學(xué)運(yùn)算。
而卷積層是由一組濾波器組成,你可以將其視為二維矩陣的數(shù)字。比如,這是一個(gè)3×3濾波器。
將輸入圖像與濾波器結(jié)合卷積生成圖像,這其中包括:
- 將濾波器疊加在圖像的某個(gè)位置上。
- 在濾波器中的值和圖像中的相應(yīng)值之間進(jìn)行元素乘法。
- 將所有元素的乘積相加。這個(gè)和就是輸出圖像中的目標(biāo)像素的輸出值
- 對(duì)所有位置重復(fù)進(jìn)行。
這樣說(shuō),可能有些抽象看不太懂。沒(méi)關(guān)系,例子這就來(lái)了。
我們以一個(gè)微小的4×4灰度圖像和一個(gè)3×3的濾波器為例。
圖像中的數(shù)字就是我們?nèi)粘R?jiàn)到的像素強(qiáng)度,其中0為黑色,255為白色,我們的輸出設(shè)置成為、一個(gè)2×2的輸出圖像。
首先,將我們的濾波器疊加到圖像的左上位置。
接著,將兩個(gè)值(圖像值和濾波器值)進(jìn)行逐元素相乘。得到了如下的表格:
得出結(jié)果62-33=29。
以此類(lèi)推,就可以得到2×2圖像的數(shù)值。
卷積有什么用?
我們先把卷積的用途放一下,來(lái)看圖。
這不就是剛剛3×3的濾波器嗎?其實(shí)它還有一個(gè)專(zhuān)業(yè)的名字——垂直Sobel濾波器,對(duì)應(yīng)的還有一個(gè)水平Sobel濾波器,就是中間橫著的一行數(shù)字為0。
其實(shí),Sobel濾波器是邊緣檢測(cè)器,垂直Sobel濾波器是檢測(cè)垂直邊緣,而水平Sobel是檢測(cè)水平邊緣。
這么說(shuō),可能不太明顯。我們來(lái)看圖。
是不是有點(diǎn)感覺(jué)了。
試想,如果兩個(gè)濾波器都是用了,卷積是不是就能抓住圖像的邊緣特征了。
輸出圖像中的亮像素說(shuō)明了原始圖像的周?chē)趾軓?qiáng)的邊緣。
這樣一來(lái),卷積就可以幫助我們尋找特定的局部圖像特征,比如邊緣。
填充
通常來(lái)說(shuō),我們其實(shí)都希望輸出圖像能夠跟原始圖像的大小相同。但在上面的示例中,我們是以4×4圖像為輸入,以2×2圖像為輸出,那應(yīng)該怎么解決這個(gè)問(wèn)題呢?
填充。這時(shí)候就要談到0的妙用了。
就是要在圖像周?chē)砑右蝗Α?”,而濾波器則也需要填充1個(gè)像素。
這樣,輸出跟輸入的圖像具有相同的尺寸,叫做相同填充。
卷積層
卷積層就包含了上述的一組濾波器,卷積層的主要參數(shù)就是濾波器的數(shù)量。
對(duì)于MNIST CNN,如果使用帶有8個(gè)濾波器的小型卷積層,那么輸入為28×28,輸出結(jié)果就變成了26×26×8 。
(因?yàn)槭怯行畛洌鼘⑤斎氲母叨群蛯挾葘p少2)
池化層
圖像中的相鄰i像素往往都有相似的值,而經(jīng)過(guò)卷積層也就能在相鄰像素中產(chǎn)生了相似的值。這樣就會(huì)導(dǎo)致卷積層輸出的很多信息都是多余的。
就如上述的負(fù)責(zé)邊緣檢測(cè)的濾波器,它能夠在某個(gè)位置上找到較強(qiáng)的邊緣,但是從很可能在其相鄰的一個(gè)像素也能找到較強(qiáng)的邊緣,這樣就造成了兩個(gè)相同的邊緣同時(shí)存在。
這樣的話,就造成了信息的冗余,不會(huì)發(fā)現(xiàn)新的信息。
池化就解決了這個(gè)問(wèn)題。池化,就是通過(guò)將輸入中的值集中在一起,減少輸入的大小。
通常,是通過(guò)一個(gè)簡(jiǎn)單的操作來(lái)完成的,比如取max、min或平均值。
下面是一個(gè)最大池化層的例子,池化大小為2的最大池化層。為了執(zhí)行最大池化,以2×2塊遍歷輸入圖像,并將最大值放入對(duì)應(yīng)像素的輸出圖像中。
池化將輸入的寬度和高度除以池大小。
比如,對(duì)于我們的MNIST CNN,我們將在初始轉(zhuǎn)換層之后立即放置一個(gè)池大小為2的最大池化層。池化層會(huì)將26x26x8輸入轉(zhuǎn)換為13x13x8輸出。
softmax層
實(shí)際上,最終完成CNN,還需要賦予其預(yù)測(cè)的能力。
那么,將通過(guò)使用多類(lèi)分類(lèi)問(wèn)題的標(biāo)準(zhǔn)最終層:Softmax層,這是一個(gè)完全連接(密集)的層,它使用Softmax函數(shù)作為其激活的全連接(密集)層。
什么是Softmax函數(shù)?
給定一些數(shù)字,Softmax函數(shù)就能將任意數(shù)字轉(zhuǎn)化為概率。
比如,我們選定數(shù)字 -1、0、3和5。
首先,我們需要計(jì)算e的指定數(shù)字次方,然后將其所有結(jié)果相加,當(dāng)作分母。
最后,e的指定數(shù)字次方的值就作為分子,由此計(jì)算可能性。
而以MNIST CNN為例,將使用帶有10個(gè)節(jié)點(diǎn)的softmax層作為CNN的最后一層,每個(gè)數(shù)字代表一個(gè)數(shù)字。層中的每個(gè)節(jié)點(diǎn)將連接到每個(gè)輸入。
應(yīng)用softmax變換后,由節(jié)點(diǎn)表示的概率最高的數(shù)字將是CNN的輸出了。
好了,介紹了這么多。是不是能夠很好的理解卷積神經(jīng)網(wǎng)絡(luò)了呢?
可以私戳下方鏈接了解更多哦~
傳送門(mén):
https://victorzhou.com/blog/intro-to-cnns-part-1/
https://victorzhou.com/blog/softmax/
- 英偉達(dá)最新芯片B30A曝光2025-08-20
- AI應(yīng)用如何落地政企?首先不要卷通用大模型2025-08-12
- 本科必學(xué)Dijkstra算法被超越!清華段然團(tuán)隊(duì)打破圖靈獎(jiǎng)得主證明的普遍最優(yōu)性2025-08-09
- 智能體邁入L4 時(shí)代!納米AI多智能體蜂群,可創(chuàng)作最長(zhǎng)10分鐘AI視頻2025-08-06