卷積神經網路(Convolutional Neural Network, CNN) - iT 邦幫忙

文章推薦指數: 80 %
投票人數:10人

... 法『卷積神經網路』(Convolutional Neural Network, CNN),它可以自動進行『特徵萃取』(Feature Extraction),從而應用在影像辨識及自然語言處理(NLP)上,也因『卷 ... 2018iT邦幫忙鐵人賽 DAY 6 6 AI&MachineLearning 以100張圖理解NeuralNetwork--觀念與實踐系列第 6篇 Day06:處理影像的利器--卷積神經網路(ConvolutionalNeuralNetwork) 2018鐵人賽 neuralnetwork ai IcodesoIam 2017-12-1609:32:0858209瀏覽 『自然使用者介面』(NaturalUserInterface,NUI) 這一波的人工智慧在自然使用者介面(NaturalUserInterface,NUI)有突破性的進展,包括影像(Image、Video)、語音(Voice)與文字(Text)的辨識、生成與分析,機器透過這種人類與生俱來的溝通能力,與使用者互動不僅更具親和力,也能對週遭的環境作出更合理、更有智慧的判斷與反應,尤其是,將這種能力附加到產品上,使產品應用發展產生無限的發展潛力,包括無人駕駛車、無人機、智慧家庭(SmartHome)、製造機器人(Robot)、聊天機器人(ChatBot)...等。

從這一篇開始,我們就逐一來探討影像(Image、Video)、語音(Voice)、文字(Text)的相關演算法,之前我們只用10幾行程式辨識阿拉伯數字,就令筆者興奮不已,接下來,介紹另一個演算法『卷積神經網路』(ConvolutionalNeuralNetwork,CNN),它可以自動進行『特徵萃取』(FeatureExtraction),從而應用在影像辨識及自然語言處理(NLP)上,也因『卷積層』(ConvolutionLayer)概念的導入,可以非常有效減輕NeuralNetwork訓練的負載。

卷積神經網路(ConvolutionalNeuralNetwork,CNN) CNN也是模仿人類大腦的認知方式,譬如我們辨識一個圖像,會先注意到顏色鮮明的點、線、面,之後將它們構成一個個不同的形狀(眼睛、鼻子、嘴巴...),這種抽象化的過程就是CNN演算法建立模型的方式。

卷積層(ConvolutionLayer)就是由點的比對轉成局部的比對,透過一塊塊的特徵研判,逐步堆疊綜合比對結果,就可以得到比較好的辨識結果,過程如下圖。

圖.CNN概念,圖片來源:AnIntuitiveExplanationofConvolutionalNeuralNetworks 卷積層(ConvolutionLayer) 那我們如何從點轉成面呢?很簡單,就是以圖像的每一點為中心,取周遭NxN格的點構成一個面(N稱為KernelSize,NxN的矩陣權重稱為『卷積核』),每一格給予不同的權重,計算加權總和,當作這一點的output,再移動至下一點以相同方式處理,至圖像的最後一點為止,這就是CNN的卷積層(ConvolutionLayer),請參考下圖,CS231n:ConvolutionalNeuralNetworksforVisualRecognition一文的ConvolutionDemo段落,它以動畫的方式說明取樣的方式。

卷積層處理方式與影像處理方法類似,採用滑動視窗(SlidingWindow)運算,藉由給予『卷積核』不同的權重組合,就可以偵測形狀的邊、角,也有去除噪音(Noise)及銳化(Sharpen)的效果,萃取這些特徵當作辨識的依據,這也克服了迴歸(Regression)會受『異常點』(Outliers)嚴重影響推測結果的缺點,好比說一個人的鼻子長了一顆痣,我們也應該能依據形狀辨識出那是鼻子。

圖.卷積層(ConvolutionLayer)運算方式,圖片來源:CS231n:ConvolutionalNeuralNetworksforVisualRecognition 若不引入卷積層,使用單純的隱藏層(Dense),即第二篇的作法,不僅需要很大的記憶體,計算也會耗費很長的時間,我們看一個真實的案例,ImageNet2012挑戰賽的題目,辨識227x227點的全彩圖案,每一點R/G/B各佔24bits,故輸入層單一張圖的資料量就有227x227x72,假設有60,000個樣本,隱藏層輸出1000個變數,那矩陣運算就是(60000,227x227x72)與(227x227x72,1000)的內積,那是一個多麼龐大的矩陣運算。

而卷積層的概念是假設我們在看一張圖時,每個神經元只會接收一小塊區域的反射光線,稱為『感知域』(感知域),也就是說,隱藏層的神經元只會連接上一層『感知域』內的Input(11x11),而不會連接『所有』的Input(227x227),稱之為『局部連接』(LocallyConnected),而非『完全連接』所有Input。

圖.『完全連接』(FullyConnected)vs.『局部連接』(LocalConnected),圖片來源:CS231nConvolutionalNeuralNetworksforVisualRecognition 每個隱藏層的神經元就只跟Input矩陣(11,11)作運算,運算負擔就明顯減輕了,另外,還有一個假設,稱為『共享權值』(Sharedweights),就是每一個『感知域』對下一隱藏層均使用相同的一組權重(WeightMatrix),請參閱下圖,這樣要推估的權重數量減少,又可以減輕運算的負擔,所以,運用卷積層的目的就是針對圖像或語言的特性,簡化計算的過程,進而縮短運算的時間。

圖.『權值共享』(Sharedweights),圖片來源:Whatexactlyismeantbysharedweightsinconvolutionalneuralnetwork? 在使用卷積層函數(Conv1D、Conv2D、Conv3D...)時,我們可以設定濾波器(Filter)的數目,系統在訓練的過程中,就會根據Input圖形,幫我們找出圖中出現的各種形狀濾波器(Filter),例如(+、X、O...),再往下加幾層卷積層,我們就可能找出圖像會包含的各種特徵,例如,眼睛、嘴巴、鼻子等,我們來看卷積四次的濾波器(Filter),圖片來源為https://cs.nyu.edu/~fergus/drafts/utexas2.pdf,第一層只偵測到線,到了第四層,就幾乎得到整個輪廓了。

圖.第一層濾波器(Filter)。

圖.第二層濾波器(Filter)。

圖.第三層濾波器(Filter)。

圖.第四層濾波器(Filter)。

池化層(PoolingLayer) 卷積層之間通常會加一個池化層(PoolingLayer),它是一個壓縮圖片並保留重要資訊的方法,取樣的方法一樣是採滑動視窗,但是通常取最大值(Max-Pooling),而非加權總和,若滑動視窗大小設為2,『滑動步長』(Stride)也為2,則資料量就降為原本的四分之一,但因為取最大值,它還是保留局部範圍比對的最大可能性。

也就是說,池化後的資訊更專注於圖片中是否存在相符的特徵,而非圖片中『哪裡』存在這些特徵,幫助CNN判斷圖片中是否包含某項特徵,而不必關心特徵所在的位置,這樣圖像偏移,一樣可以辨識出來(部分文字引用自卷積神經網路的運作原理一文)。

圖.Max-Pooling,視窗大小為2,『步長』(Stride)也為2的取樣方法,圖片來源:ABeginner'sGuideToUnderstandingConvolutionalNeuralNetworks 結語 透過多層卷積/池化,萃取特徵當作Input,再接至一到多個完全連接層,進行分類,這就是CNN的典型作法,下一篇我們就用CNN來作阿拉伯數字的辨識,看看有甚麼不同,緊接著,我們再介紹兩個CNN應用,說明NeuralNetwork不是只能作分類而已。

弄懂這些概念,對後續實作有很大的幫助,請耐心看完,之後的應用都跟本篇有密切的關聯。

明天見了!! 留言1 追蹤 檢舉 上一篇 Day05:Keras模型、函數及參數使用說明 下一篇 Day07:撰寫第一支CNN程式--比較『阿拉伯數字』辨識力 系列文 以100張圖理解NeuralNetwork--觀念與實踐 共31篇 目錄 RSS系列文 訂閱系列文 401人訂閱 27 Day27:音樂資訊檢索(MusicInformationRetrieval,MIR) 28 Day28:小學生談『生成對抗網路』(GenerativeAdversarialNetwork,GAN) 29 Day29:機器學習的資料處理生命週期 30 Day30:完結篇--MachineLearning工作前景與技能 31 DayN+1:進一步理解『梯度下降』(GradientDescent) 完整目錄 1則留言 0 frankyeh iT邦新手5級‧ 2021-02-1910:02:40 小弟目前也在計算該類問題,參考前輩的文章發現有些不懂,請問227x227x96,96的值如何計算?謝謝 回應 2 檢舉 IcodesoIam iT邦高手1級‧ 2021-02-1910:10:22 檢舉 R/G/B各佔24bit,24*3應為72,已更正,謝謝指教。

R/G/B各佔24bit,24*3應為72,已更正,謝謝指教。

修改 frankyeh iT邦新手5級‧ 2021-02-1910:11:43 檢舉 感謝前輩指點 感謝前輩指點 修改 登入發表回應 我要留言 立即登入留言 iT邦幫忙鐵人賽 參賽組數 1087組 團體組數 52組 累計文章數 20471篇 完賽人數 572人 鐵人賽最新文章 大盤到底能不能攻上一萬八?? gotodie?那個goto到底能不能用啊? 2021/12/12更新 予焦啦!一夢終須醒...... 盤點清查與檢測掃描-資通安全健診 [13th][Day23]httpresponseheader(下) [13th][Day22]httpresponseheader(上) [13th][Day21]golangcontext 股票怎麼選?掌握這原則,你也能找到強勢股 Gitpush 前往鐵人賽 技術推廣專區 [Day2]抓取每日收盤價 [Day1]基本工具安裝 利用python取得永豐銀行API的Nonce [Day03]tinyML開發板介紹 永豐金融API測試員 [Day01]在享受tinyML這道美食之前 [Day3]使用ta-lib製作指標 [Day4]函數打包與買進持有報酬率試算 計算API所需要的參數:HashID 計算API所需要的參數:IV 前往鐵人賽 熱門問題 我有一個客戶中了mljx病毒勒索950美金我免費轉讓有人要接嗎? 加班提醒視窗 家中的網路配置 C#超級新手請教一個非常笨的問題 Google相簿背後的系統設計? 切割vlan網段方式 臉書訊息讀取狀態 【已解決】如何安裝舊版本的VS2019 請問目前php8版本的問題 DNS好像怪怪的 IT邦幫忙 站方公告 【2021iThome鐵人賽】登登登!究竟獎落誰家,2021iThome鐵人賽得獎名單正式揭曉 熱門tag 看更多 13th鐵人賽 12th鐵人賽 11th鐵人賽 鐵人賽 2019鐵人賽 2018鐵人賽 javascript 2017鐵人賽 windows php python windowsserver linux c# 程式設計 資訊安全 css vue.js sql 分享 熱門回答 家中的網路配置 切割vlan網段方式 Google相簿背後的系統設計? 請問目前php8版本的問題 請問大神centos5.5DNSSERVER的DNS檔案在哪個路徑 請問初學laravel要做什麼專案 LinuxCent7OS(文字介面) C#超級新手請教一個非常笨的問題 關於網頁顯示問題 加班提醒視窗 熱門文章 gotodie?那個goto到底能不能用啊? 予焦啦!一夢終須醒...... 2021/12/12更新 第九隻狗勾 第八隻狗勾 軟體工程師從新手到高手的流程 大盤到底能不能攻上一萬八?? 【從零開始的C語言筆記】第二十九篇-讀檔&寫檔(1) CI/CD-Drone五分鐘成為終極工具人 群輝ds920+nas網路儲存設備簡易開箱,滿足家庭影音需求 一週點數排行 更多點數排行 海綿寶寶(antijava) ㊣浩瀚星空㊣(yoching) 居然解出來了(partyyaya) ccenjor(ccenjor) japhenchen(japhenchen) mathewkl(mathewkl) 小山丘(a243318490) horace_work(horace_work) juck30808(juck30808) raytracy(raytracy) × At 輸入對方的帳號或暱稱 Loading 找不到結果。

標記 {{result.label}} {{result.account}} 關閉



請為這篇文章評分?