讓你的電腦擁有“視力”,用卷積神經網絡就可以!

本文為 AI 研習社編譯的技術博客,原標題 :

How To Teach A Computer To See With Convolutional Neural Networks

作者 | Alex Yu

翻譯 | zackary、chesc

校對 | 醬番梨 整理 | 菠蘿妹

原文鏈接:

https://towardsdatascience.com/how-to-teach-a-computer-to-see-with-convolutional-neural-networks-96c120827cd1

近年來,計算機視覺領域取得了很大的進展。卷積神經網絡極大地提升了圖像識別模型的精度,在生活中也有很多的應用。在這篇文章中,我將描述它的工作原理、一些實際應用,以及如何用Python和Keras是實現一個卷積神經網絡。

让你的电脑拥有“视力”,用卷积神经网络就可以!

圖片來自Amanda Dalbjörn

對於大多數人來說,視覺是我們日常生活的一部分。我們使用雙眼探索周圍的世界。我們用雙眼交流、理解。我無需告訴你視覺有多重要。視覺對我們來說如此關鍵,你甚至難以想象沒有視覺時的情形。

但是,如果我讓你解釋你是如何“看見”的呢?我們是如何理解我們眼睛傳來的信息的?首先,當你看著某樣東西,然後......發生了什麼?我們的大腦就像一臺自然進化了數百萬年的超級電腦。在識別不同的模式和物體上,我們已經變得十分在行。

許多技術都是基於自然機制的。用相機舉個例子:快門控制光線的量,就像我們眼睛裡的瞳孔,鏡頭和眼睛聚焦並翻轉圖像。相機和眼睛都通過一些方式感知光線並將它轉化為可被理解的信號。

让你的电脑拥有“视力”,用卷积神经网络就可以!

圖片來自Alfonso Reyes

但是,很顯然地,我們不是長出了腿和胳膊的行走相機。現有的相機並不能完全理解它們拍攝的圖片。如果它們能做到的話那就有點嚇人了。對於相機和計算機來說,一幅圖片只是一串串數字組成的向量。

让你的电脑拥有“视力”,用卷积神经网络就可以!

用矩陣表示的數字8,來自MNIST數據集

那麼我們到底如何創建一個程序,來辨別一幅圖片是狗還是貓呢?這正是我們試圖用計算機視覺解決的問題。

也就是神經網絡能夠幫助我們解決的問題!

神經網絡是如何工作的

人工神經網絡(Artificial Neural Networks)是一種基於人類大腦的程序。神經網絡由許多個聯結的神經元組成。有一些神經網絡有數百萬個節點(神經元)和數十億個聯結!

一個神經元可以看作是一個函數,它接受一個輸入值,返回一個輸出值。

让你的电脑拥有“视力”,用卷积神经网络就可以!

人工神經元模仿生物學中的神經元

單個神經元本身不能做什麼。但是當你把很多的神經元聯結在一起的時候,事情就變得有趣多了。神經網絡的不同結構能讓你做許多很酷的事情。

让你的电脑拥有“视力”,用卷积神经网络就可以!

你可以得到類似的網絡

每個神經元都與自己的“權重”有聯繫。舉個例子:我們有一個神經網絡試圖分辨一張圖片是不是一個熱狗。那麼我們就會想要:在神經網絡中,包含熱狗的特徵的神經元比包含普通狗的特徵的神經元更重要。

神經網絡的權重是通過在數據集上訓練得到的。它會運行許多次,根據損失函數通過反向傳播改變各個權重。可以說神經網絡被輸入測試數據,然後得到並分析結果,取得得分並使自己變得更加準確。通過這個過程,一個神經網絡可以學習並提高預測的準確度。

我不會講述反向傳播過程和損失函數,但是有許多很棒的資源介紹了它們,例如這一篇。卷積神經網絡(Convolutional Neural Networks)是神經網絡的一種特別的類型。它們在圖像數據集上表現的很好。

卷積神經網絡

让你的电脑拥有“视力”,用卷积神经网络就可以!

卷積神經網絡圖示

正如我之前提到的,計算機將圖片看作矩陣中的一堆數字。CNN的不同層將函數應用於這些矩陣,以從圖像中提取各種特徵並降低圖像的複雜度。

讓我們一起看看訓練一個用作熱狗檢測器的卷積神經網絡所需的幾個步驟吧。

首先,我們為卷積神經網絡的權重賦予隨機的初始值。這基本上意味著網絡純粹就是在猜測。一旦網絡做出了它的預測,它將使用一個損失函數來評估自己的誤差,並更新自己的權重以在下一次獲得更好的結果。

卷積神經網絡包含一些層:卷積層和池化層。你可以這樣想象在卷積層裡發生了什麼:

想象你有一幅圖片和一個放大鏡。將你的放大鏡放在圖片左上角的正上方,你將尋找一個特別的特徵並記下你有沒有找到。慢慢地移動你的放大鏡並重復這個操作。

让你的电脑拥有“视力”,用卷积神经网络就可以!

可視化卷積層中的特徵提取

卷積層創造了一系列的特徵映射。

對於用來描述不同圖片,比如動物或者面部,的卷積神經網絡來說,卷積神經網絡尋找的特徵可以是目標的不同邊緣。就像列出圖片中各個邊緣的列表,這個列表又被傳入另一個相同功能的卷積層,只不過這一層尋找的是更大的特徵,比如說動物的一條腿或者面部的一隻眼睛。最終,所有的特徵被傳入一個全連接層,它會為圖像分類。

池化層也與卷積層一起使用,它就像另一個放大鏡,只不過它不尋找特徵,而是取區域裡的最大值以減少圖像的複雜度。

让你的电脑拥有“视力”,用卷积神经网络就可以!

卷積神經網絡裡的池化

這很實用,因為很多圖片都很大,它們的像素數目太大,處理器計算起來很困難。池化使得我們能夠減少圖片的大小,同時還保留了大多數重要信息。池化也被用來防止過擬合。過擬合是指模型在訓練數據上表現得很好,但是卻不能在它從未見過的數據上獲得好的結果。

让你的电脑拥有“视力”,用卷积神经网络就可以!

在一個線性數據集上發生了過擬合

如你所見,圖裡的數據本可以用一條直線(黑色)表示。用藍色表示的模型匹配了所有的數據點,但是如果我們想讓這個模型預測一些點時,它卻做不到。回到卷積神經網絡,這意味著模型在它訓練集上會十分準確,但是對於其他不在訓練集裡的圖片,它卻不能作出正確的判斷。

最後,我們將卷積神經網絡變成了一個很長的特徵向量,我們基本上將數據放在一起,輸入全連接層中以作出預測。

為什麼神經網絡更好?

假如我們沒有使用神經網絡,那麼我們會如何處理這個問題?比方說,我們正在嘗試編寫一個識別貓的程序,我們可以嘗試通過尋找某些形狀來表示貓。

让你的电脑拥有“视力”,用卷积神经网络就可以!

來自計算機視覺專家李飛飛的TED演講的貓的形狀

看起來很簡單吧?但等一下。並非所有的貓都像這樣。如果你有一隻貓在伸懶腰怎麼辦?我們需要添加更多形狀。

让你的电脑拥有“视力”,用卷积神经网络就可以!

來自計算機視覺專家李飛飛的TED演講的更多貓形狀。

到目前為止,應該很清楚,直接告訴計算機尋找某些形狀是行不通的。貓有各種形狀和大小。並且這只是假設我們僅僅在尋找貓,如果我們想要一個可以對各種圖片進行分類的程序怎麼辦?

這就是為什麼使用神經網絡要好得多的原因。您可以讓計算機設置自己的規則。通過使用十分先進的算法,神經網絡可以瘋狂地高精度對圖像進行分類。有些模型已經在這個任務中擊敗了人類!

我們應用計算機視覺的一些非常酷的方法

隨著算法變得更有效,硬件變得更強大,我們可以用神經網絡來完成很多任務,這幾乎就像是科幻小說一樣。但這並不意味著我們現在沒有用這項技術做很多很酷的事情!

零售

你可能在新聞中聽說過它,電子商務巨頭的無人收款雜貨店--Amazon Go。你走進來,拿起一些東西,然後走出去。系統會自動向您收取所需的費用。遍佈天花板的相機可以跟蹤您拾取的物品。然而系統不夠完美,可能很容易發生入店行竊。看看這個想法在未來幾年如何發展將會非常有趣。

自動駕駛汽車

在我看來,自動駕駛汽車是目前正在開展的一些最酷的事情。Waymo最初是Google的自動駕駛汽車項目,Uber和Tesla目前正在研發一些可以自動導航道路的車輛。

Waymo的自動駕駛汽車車隊已經行駛了超過1000萬英里的路程!平均每年行駛約12,000英里。總的來說,這是超過800年的駕駛!

让你的电脑拥有“视力”,用卷积神经网络就可以!

Waymo的一輛自動駕駛汽車

醫療保健

在醫療保健領域,CNN被用於識別許多不同類型的疾病。通過對癌症或其他醫療條件的某些數據集進行訓練,神經網絡可以以高準確率確定其是否患病!通過神經網絡提取特徵並在數據中查找模式,它可以利用某些我們從未考慮過的圖像信息!

用Keras創建卷積神經網絡

現在我們進一步直觀瞭解CNN應該怎麼運作。我們可以在Python裡使用Keras框架創建一個卷積神經網絡,其中Keras是一個用Python編寫的高級API。Keras可以幫助我們編寫易於理解和可讀性強的代碼。

您可以首先安裝Anaconda,再在命令界面中運行 conda install keras。然後你可以使用Jupyter Notebooks開始進行Python編程。如果您想在雲中運行所有內容,也可以使用Google’s Colaboratory。

我們將在MNIST數據集上進行實驗,這個數據集是Keras庫的一部分。它包含60,000個手寫數字的訓練樣本和10,000個測試樣本。讓我們開始吧!

让你的电脑拥有“视力”,用卷积神经网络就可以!

MNIST數據集中的前幾個訓練樣本

首先,我們想要從Keras庫導入我們需要的所有包。這包括Sequential model,這意味著我們可以通過添加 layers 來輕鬆構建模型。接下來我們將導入Conv2D(Convolution2D),MaxPooling2D,Flatten和Dense 層。前3個是明顯的,而Dense層會幫我們構建全連接層。

我們需要Keras Utils來幫助我們對數據進行編碼,以確保它與我們模型的其他部分兼容。這使得我們不會把數字9看作比1更好 。最後,我們導入將用於訓練模型的MNIST數據集。

让你的电脑拥有“视力”,用卷积神经网络就可以!

導入數據集後,我們需要將其拆分為訓練數據和測試數據。訓練數據是我們要用神經網絡進行學習的。測試數據是我們將用來衡量準確度的。我們將調整數據以匹配TensorFlow後端所需的格式。接下來,我們將對數據進行標準化,以使值的範圍保持在0到1左右,並對MNIST標籤進行分類編碼。

让你的电脑拥有“视力”,用卷积神经网络就可以!

非常棒!現在我們可以開始構建我們的模型。我們首先創建一個順序模型,它是一個線性的layers堆棧。正如您在下面的代碼中看到的,這使我們可以非常輕鬆地向模型添加更多層。

让你的电脑拥有“视力”,用卷积神经网络就可以!

在我們完成模型構建之後,我們將編輯它。該模型使用Adam優化器,它是一種用於調整權重的梯度下降算法。我們的模型使用的損失函數是分類交叉熵,它告訴我們這個模型離結果有多遠。metrics參數用於定義如何評估性能。它類似於損失函數,但在實際訓練過程中不會使用。

我們將在訓練集上 fit 或 train 我們的模型。batch size決定了每次迭代時我們將考慮的圖像數量。epochs的數量決定了模型迭代整個數據集的次數。在一定次數的epochs之後,該模型將基本上停止改進。

verbose值決定模型是否會告訴我們模型的進度,validation_data決定模型在每次迭代之後如何評估其損失值。

最後,我們將打印出我們模型的準確度。最終結果應介於98%和99%之間。

让你的电脑拥有“视力”,用卷积神经网络就可以!

您可以在我的Github上找到完整的代碼,也可以在 Google Colaboratory上運行。

關鍵要點

  • 神經網絡鬆散地基於我們的大腦解釋信息的方式。

  • 卷積神經網絡特別適用於圖像。

  • 計算機視覺有很多真實世界的應用。

  • 創建自己的神經網絡實際上非常簡單。

感謝您閱讀我的第一篇文章!我在寫作的過程中學到了很多東西。如果您喜歡它,請:

  • 在 LinkedIn 添加我並跟隨我的媒體更新我的歷程

  • 留下一些反饋或給我發電子郵件([email protected]

想要繼續查看該篇文章相關鏈接和參考文獻?

長按鏈接點擊打開或點擊底部【讓你的電腦擁有“視力”,用卷積神經網絡就可以!】:

https://ai.yanxishe.com/page/TextTranslation/1290

AI研習社每日更新精彩內容,觀看更多精彩內容:雷鋒網雷鋒網雷鋒網

五個很厲害的 CNN 架構

一文帶你讀懂計算機視覺

用Pytorch做深度學習(第一部分)

Python高級技巧:用一行代碼減少一半內存佔用

等你來譯:

(Python)3D人臉處理工具face3d

25個能放到數據湖中的語音研究數據集

如何在數據科學麵試中脫穎而出

Apache Spark SQL以及DataFrame的基本概念,架構以及使用案例


分享到:


相關文章: