近年來,計(jì)算機(jī)視覺領(lǐng)域取得了很大的進(jìn)展。卷積神經(jīng)網(wǎng)絡(luò)極大地提升了圖像識(shí)別模型的精度,在生活中也有很多的應(yīng)用。在這篇文章中,我將描述它的工作原理、一些實(shí)際應(yīng)用,以及如何用Python和Keras是實(shí)現(xiàn)一個(gè)卷積神經(jīng)網(wǎng)絡(luò)。 圖片來自Amanda Dalbj?rn 對(duì)于大多數(shù)人來說,視覺是我們?nèi)粘I畹囊徊糠?。我們使用雙眼探索周圍的世界。我們用雙眼交流、理解。我無需告訴你視覺有多重要。視覺對(duì)我們來說如此關(guān)鍵,你甚至難以想象沒有視覺時(shí)的情形。 但是,如果我讓你解釋你是如何“看見”的呢?我們是如何理解我們眼睛傳來的信息的?首先,當(dāng)你看著某樣?xùn)|西,然后......發(fā)生了什么?我們的大腦就像一臺(tái)自然進(jìn)化了數(shù)百萬年的超級(jí)電腦。在識(shí)別不同的模式和物體上,我們已經(jīng)變得十分在行。 許多技術(shù)都是基于自然機(jī)制的。用相機(jī)舉個(gè)例子:快門控制光線的量,就像我們眼睛里的瞳孔,鏡頭和眼睛聚焦并翻轉(zhuǎn)圖像。相機(jī)和眼睛都通過一些方式感知光線并將它轉(zhuǎn)化為可被理解的信號(hào)。 圖片來自Alfonso Reyes 但是,很顯然地,我們不是長出了腿和胳膊的行走相機(jī)?,F(xiàn)有的相機(jī)并不能完全理解它們拍攝的圖片。如果它們能做到的話那就有點(diǎn)嚇人了。對(duì)于相機(jī)和計(jì)算機(jī)來說,一幅圖片只是一串串?dāng)?shù)字組成的向量。 用矩陣表示的數(shù)字8,來自MNIST數(shù)據(jù)集 那么我們到底如何創(chuàng)建一個(gè)程序,來辨別一幅圖片是狗還是貓呢?這正是我們?cè)噲D用計(jì)算機(jī)視覺解決的問題。 也就是神經(jīng)網(wǎng)絡(luò)能夠幫助我們解決的問題! 神經(jīng)網(wǎng)絡(luò)是如何工作的人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Networks)是一種基于人類大腦的程序。神經(jīng)網(wǎng)絡(luò)由許多個(gè)聯(lián)結(jié)的神經(jīng)元組成。有一些神經(jīng)網(wǎng)絡(luò)有數(shù)百萬個(gè)節(jié)點(diǎn)(神經(jīng)元)和數(shù)十億個(gè)聯(lián)結(jié)! 一個(gè)神經(jīng)元可以看作是一個(gè)函數(shù),它接受一個(gè)輸入值,返回一個(gè)輸出值。 人工神經(jīng)元模仿生物學(xué)中的神經(jīng)元 單個(gè)神經(jīng)元本身不能做什么。但是當(dāng)你把很多的神經(jīng)元聯(lián)結(jié)在一起的時(shí)候,事情就變得有趣多了。神經(jīng)網(wǎng)絡(luò)的不同結(jié)構(gòu)能讓你做許多很酷的事情。 你可以得到類似的網(wǎng)絡(luò) 每個(gè)神經(jīng)元都與自己的“權(quán)重”有聯(lián)系。舉個(gè)例子:我們有一個(gè)神經(jīng)網(wǎng)絡(luò)試圖分辨一張圖片是不是一個(gè)熱狗。那么我們就會(huì)想要:在神經(jīng)網(wǎng)絡(luò)中,包含熱狗的特征的神經(jīng)元比包含普通狗的特征的神經(jīng)元更重要。 神經(jīng)網(wǎng)絡(luò)的權(quán)重是通過在數(shù)據(jù)集上訓(xùn)練得到的。它會(huì)運(yùn)行許多次,根據(jù)損失函數(shù)通過反向傳播改變各個(gè)權(quán)重。可以說神經(jīng)網(wǎng)絡(luò)被輸入測試數(shù)據(jù),然后得到并分析結(jié)果,取得得分并使自己變得更加準(zhǔn)確。通過這個(gè)過程,一個(gè)神經(jīng)網(wǎng)絡(luò)可以學(xué)習(xí)并提高預(yù)測的準(zhǔn)確度。 我不會(huì)講述反向傳播過程和損失函數(shù),但是有許多很棒的資源介紹了它們,例如這一篇。卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks)是神經(jīng)網(wǎng)絡(luò)的一種特別的類型。它們?cè)趫D像數(shù)據(jù)集上表現(xiàn)的很好。 卷積神經(jīng)網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò)圖示 正如我之前提到的,計(jì)算機(jī)將圖片看作矩陣中的一堆數(shù)字。CNN的不同層將函數(shù)應(yīng)用于這些矩陣,以從圖像中提取各種特征并降低圖像的復(fù)雜度。 讓我們一起看看訓(xùn)練一個(gè)用作熱狗檢測器的卷積神經(jīng)網(wǎng)絡(luò)所需的幾個(gè)步驟吧。 首先,我們?yōu)榫矸e神經(jīng)網(wǎng)絡(luò)的權(quán)重賦予隨機(jī)的初始值。這基本上意味著網(wǎng)絡(luò)純粹就是在猜測。一旦網(wǎng)絡(luò)做出了它的預(yù)測,它將使用一個(gè)損失函數(shù)來評(píng)估自己的誤差,并更新自己的權(quán)重以在下一次獲得更好的結(jié)果。 卷積神經(jīng)網(wǎng)絡(luò)包含一些層:卷積層和池化層。你可以這樣想象在卷積層里發(fā)生了什么: 想象你有一幅圖片和一個(gè)放大鏡。將你的放大鏡放在圖片左上角的正上方,你將尋找一個(gè)特別的特征并記下你有沒有找到。慢慢地移動(dòng)你的放大鏡并重復(fù)這個(gè)操作。 可視化卷積層中的特征提取 卷積層創(chuàng)造了一系列的特征映射。 對(duì)于用來描述不同圖片,比如動(dòng)物或者面部,的卷積神經(jīng)網(wǎng)絡(luò)來說,卷積神經(jīng)網(wǎng)絡(luò)尋找的特征可以是目標(biāo)的不同邊緣。就像列出圖片中各個(gè)邊緣的列表,這個(gè)列表又被傳入另一個(gè)相同功能的卷積層,只不過這一層尋找的是更大的特征,比如說動(dòng)物的一條腿或者面部的一只眼睛。最終,所有的特征被傳入一個(gè)全連接層,它會(huì)為圖像分類。 池化層也與卷積層一起使用,它就像另一個(gè)放大鏡,只不過它不尋找特征,而是取區(qū)域里的最大值以減少圖像的復(fù)雜度。 卷積神經(jīng)網(wǎng)絡(luò)里的池化 這很實(shí)用,因?yàn)楹芏鄨D片都很大,它們的像素?cái)?shù)目太大,處理器計(jì)算起來很困難。池化使得我們能夠減少圖片的大小,同時(shí)還保留了大多數(shù)重要信息。池化也被用來防止過擬合。過擬合是指模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)得很好,但是卻不能在它從未見過的數(shù)據(jù)上獲得好的結(jié)果。 在一個(gè)線性數(shù)據(jù)集上發(fā)生了過擬合 如你所見,圖里的數(shù)據(jù)本可以用一條直線(黑色)表示。用藍(lán)色表示的模型匹配了所有的數(shù)據(jù)點(diǎn),但是如果我們想讓這個(gè)模型預(yù)測一些點(diǎn)時(shí),它卻做不到?;氐骄矸e神經(jīng)網(wǎng)絡(luò),這意味著模型在它訓(xùn)練集上會(huì)十分準(zhǔn)確,但是對(duì)于其他不在訓(xùn)練集里的圖片,它卻不能作出正確的判斷。 最后,我們將卷積神經(jīng)網(wǎng)絡(luò)變成了一個(gè)很長的特征向量,我們基本上將數(shù)據(jù)放在一起,輸入全連接層中以作出預(yù)測。 為什么神經(jīng)網(wǎng)絡(luò)更好? 假如我們沒有使用神經(jīng)網(wǎng)絡(luò),那么我們會(huì)如何處理這個(gè)問題?比方說,我們正在嘗試編寫一個(gè)識(shí)別貓的程序,我們可以嘗試通過尋找某些形狀來表示貓。 來自計(jì)算機(jī)視覺專家李飛飛的TED演講的貓的形狀 看起來很簡單吧?但等一下。并非所有的貓都像這樣。如果你有一只貓?jiān)谏鞈醒趺崔k?我們需要添加更多形狀。 來自計(jì)算機(jī)視覺專家李飛飛的TED演講的更多貓形狀。 到目前為止,應(yīng)該很清楚,直接告訴計(jì)算機(jī)尋找某些形狀是行不通的。貓有各種形狀和大小。并且這只是假設(shè)我們僅僅在尋找貓,如果我們想要一個(gè)可以對(duì)各種圖片進(jìn)行分類的程序怎么辦? 這就是為什么使用神經(jīng)網(wǎng)絡(luò)要好得多的原因。您可以讓計(jì)算機(jī)設(shè)置自己的規(guī)則。通過使用十分先進(jìn)的算法,神經(jīng)網(wǎng)絡(luò)可以瘋狂地高精度對(duì)圖像進(jìn)行分類。有些模型已經(jīng)在這個(gè)任務(wù)中擊敗了人類! 我們應(yīng)用計(jì)算機(jī)視覺的一些非常酷的方法 隨著算法變得更有效,硬件變得更強(qiáng)大,我們可以用神經(jīng)網(wǎng)絡(luò)來完成很多任務(wù),這幾乎就像是科幻小說一樣。但這并不意味著我們現(xiàn)在沒有用這項(xiàng)技術(shù)做很多很酷的事情! 零售 你可能在新聞中聽說過它,電子商務(wù)巨頭的無人收款雜貨店--Amazon Go。你走進(jìn)來,拿起一些東西,然后走出去。系統(tǒng)會(huì)自動(dòng)向您收取所需的費(fèi)用。遍布天花板的相機(jī)可以跟蹤您拾取的物品。然而系統(tǒng)不夠完美,可能很容易發(fā)生入店行竊??纯催@個(gè)想法在未來幾年如何發(fā)展將會(huì)非常有趣。 自動(dòng)駕駛汽車 在我看來,自動(dòng)駕駛汽車是目前正在開展的一些最酷的事情。Waymo最初是Google的自動(dòng)駕駛汽車項(xiàng)目,Uber和Tesla目前正在研發(fā)一些可以自動(dòng)導(dǎo)航道路的車輛。 Waymo的自動(dòng)駕駛汽車車隊(duì)已經(jīng)行駛了超過1000萬英里的路程!平均每年行駛約12,000英里??偟膩碚f,這是超過800年的駕駛! Waymo的一輛自動(dòng)駕駛汽車 醫(yī)療保健 在醫(yī)療保健領(lǐng)域,CNN被用于識(shí)別許多不同類型的疾病。通過對(duì)癌癥或其他醫(yī)療條件的某些數(shù)據(jù)集進(jìn)行訓(xùn)練,神經(jīng)網(wǎng)絡(luò)可以以高準(zhǔn)確率確定其是否患病!通過神經(jīng)網(wǎng)絡(luò)提取特征并在數(shù)據(jù)中查找模式,它可以利用某些我們從未考慮過的圖像信息! 用Keras創(chuàng)建卷積神經(jīng)網(wǎng)絡(luò)現(xiàn)在我們進(jìn)一步直觀了解CNN應(yīng)該怎么運(yùn)作。我們可以在Python里使用Keras框架創(chuàng)建一個(gè)卷積神經(jīng)網(wǎng)絡(luò),其中Keras是一個(gè)用Python編寫的高級(jí)API。Keras可以幫助我們編寫易于理解和可讀性強(qiáng)的代碼。 您可以首先安裝Anaconda,再在命令界面中運(yùn)行 conda install keras。然后你可以使用Jupyter Notebooks開始進(jìn)行Python編程。如果您想在云中運(yùn)行所有內(nèi)容,也可以使用Google’s Colaboratory。 我們將在MNIST數(shù)據(jù)集上進(jìn)行實(shí)驗(yàn),這個(gè)數(shù)據(jù)集是Keras庫的一部分。它包含60,000個(gè)手寫數(shù)字的訓(xùn)練樣本和10,000個(gè)測試樣本。讓我們開始吧! MNIST數(shù)據(jù)集中的前幾個(gè)訓(xùn)練樣本 首先,我們想要從Keras庫導(dǎo)入我們需要的所有包。這包括Sequential model,這意味著我們可以通過添加 layers 來輕松構(gòu)建模型。接下來我們將導(dǎo)入Conv2D(Convolution2D),MaxPooling2D,F(xiàn)latten和Dense 層。前3個(gè)是明顯的,而Dense層會(huì)幫我們構(gòu)建全連接層。 我們需要Keras Utils來幫助我們對(duì)數(shù)據(jù)進(jìn)行編碼,以確保它與我們模型的其他部分兼容。這使得我們不會(huì)把數(shù)字9看作比1更好 。最后,我們導(dǎo)入將用于訓(xùn)練模型的MNIST數(shù)據(jù)集。 導(dǎo)入數(shù)據(jù)集后,我們需要將其拆分為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)。訓(xùn)練數(shù)據(jù)是我們要用神經(jīng)網(wǎng)絡(luò)進(jìn)行學(xué)習(xí)的。測試數(shù)據(jù)是我們將用來衡量準(zhǔn)確度的。我們將調(diào)整數(shù)據(jù)以匹配TensorFlow后端所需的格式。接下來,我們將對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化,以使值的范圍保持在0到1左右,并對(duì)MNIST標(biāo)簽進(jìn)行分類編碼。 非常棒!現(xiàn)在我們可以開始構(gòu)建我們的模型。我們首先創(chuàng)建一個(gè)順序模型,它是一個(gè)線性的layers堆棧。正如您在下面的代碼中看到的,這使我們可以非常輕松地向模型添加更多層。 在我們完成模型構(gòu)建之后,我們將編輯它。該模型使用Adam優(yōu)化器,它是一種用于調(diào)整權(quán)重的梯度下降算法。我們的模型使用的損失函數(shù)是分類交叉熵,它告訴我們這個(gè)模型離結(jié)果有多遠(yuǎn)。metrics參數(shù)用于定義如何評(píng)估性能。它類似于損失函數(shù),但在實(shí)際訓(xùn)練過程中不會(huì)使用。 我們將在訓(xùn)練集上 fit 或 train 我們的模型。batch size決定了每次迭代時(shí)我們將考慮的圖像數(shù)量。epochs的數(shù)量決定了模型迭代整個(gè)數(shù)據(jù)集的次數(shù)。在一定次數(shù)的epochs之后,該模型將基本上停止改進(jìn)。 verbose值決定模型是否會(huì)告訴我們模型的進(jìn)度,validation_data決定模型在每次迭代之后如何評(píng)估其損失值。 最后,我們將打印出我們模型的準(zhǔn)確度。最終結(jié)果應(yīng)介于98%和99%之間。 您可以在我的Github上找到完整的代碼,也可以在 Google Colaboratory上運(yùn)行。 關(guān)鍵要點(diǎn)
感謝您閱讀我的第一篇文章!我在寫作的過程中學(xué)到了很多東西。如果您喜歡它,請(qǐng):
想要繼續(xù)查看該篇文章相關(guān)鏈接和參考文獻(xiàn)? 長按鏈接點(diǎn)擊打開或點(diǎn)擊底部【讓你的電腦擁有“視力”,用卷積神經(jīng)網(wǎng)絡(luò)就可以!】: https://ai./page/TextTranslation/1290 AI研習(xí)社每日更新精彩內(nèi)容,觀看更多精彩內(nèi)容:雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng) 五個(gè)很厲害的 CNN 架構(gòu)一文帶你讀懂計(jì)算機(jī)視覺 用Pytorch做深度學(xué)習(xí)(第一部分)Python高級(jí)技巧:用一行代碼減少一半內(nèi)存占用等你來譯: (Python)3D人臉處理工具face3d25個(gè)能放到數(shù)據(jù)湖中的語音研究數(shù)據(jù)集如何在數(shù)據(jù)科學(xué)面試中脫穎而出Apache Spark SQL以及DataFrame的基本概念,架構(gòu)以及使用案例 |
|