丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給恒亮
發(fā)送

0

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

本文作者: 恒亮 2017-03-22 12:17
導語:大牛通過代碼實操為你詳細講解究竟怎樣用 Tensorflow 搭建一套自己的圖像識別模塊。

自 2015 年 11 月首次發(fā)布以來,TensorFlow 憑借谷歌的強力支持,快速的更新和迭代,齊全的文檔和教程,以及上手快且簡單易用等諸多的優(yōu)點,已經在圖像識別、語音識別、自然語言處理、數(shù)據(jù)挖掘和預測等 AI 場景中得到了十分廣泛的應用。

在所有這些 AI 應用場景中,或許是源于視覺對人類的直觀性和重要性,圖像識別成為其中發(fā)展速度最快的一個。目前,該技術已經逐漸趨于成熟,并在人臉和情緒識別、安防、醫(yī)療篩查和汽車壁障等諸多領域都取得了重大成功。

在這種情況下,對于絕大多數(shù)的 AI 開發(fā)者而言,利用 TensorFlow 自己親手搭建一個圖像識別模塊,就成了一項最順理成章的挑戰(zhàn)。

為了幫助有志于此的開發(fā)者實現(xiàn)目標,也為了向那些親手搭建過圖像識別模塊的技術達人提供一個與行業(yè)大牛交流、學習的機會,本次公開課雷鋒網 AI 研習社有幸邀請到才云科技(Caicloud.io)聯(lián)合創(chuàng)始人、首席大數(shù)據(jù)科學家鄭澤宇,他將深入到代碼層為我們詳細講解究竟怎么用 Tensorflow 自己親手搭建一套圖像識別模塊。

  嘉賓介紹

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

鄭澤宇,暢銷書《TensorFlow:實戰(zhàn) Google 深度學習框架》作者,才云科技(Caicloud.io)聯(lián)合創(chuàng)始人、首席大數(shù)據(jù)科學家。才云科技(Caicloud.io)是一家云計算、人工智能創(chuàng)業(yè)公司。最近推出全球首個商用 TensorFlow as a Service (TaaS) 深度學習平臺和行業(yè)大數(shù)據(jù)解決方案,用數(shù)據(jù)助力企業(yè)成長。

鄭澤宇曾在 Google 擔任高級工程師,作為主要技術人員參與并領導了多個大數(shù)據(jù)項目。提出并主導的產品聚類項目用于銜接谷歌購物和谷歌知識圖譜(Knowledge Graph)數(shù)據(jù),使得知識卡片形式的廣告逐步取代傳統(tǒng)的產品列表廣告,開啟了谷歌購物廣告在搜索頁面投遞的新紀元。

鄭澤宇擁有 CMU 計算機碩士學位,在機器學習、人工智能領域有多年研究經驗, 并在 SIGIR、SIGKDD、ACL、ICDM、ICWSM 等頂級國際會議上發(fā)表多篇學術論文。

  公開課內容

本次公開課的主要內容包括:

1. 深度學習簡介

2. 神經網絡工作原理

3. 用 TensorFlow 實現(xiàn)圖像識別

4. 疑難問題解答及討論

以下為公開課完整視頻:共 55 分鐘。

 

以下為公開課內容的文字及 PPT 整理。

大家好,今天我想跟大家分享一些深度學習算法在圖像識別上的應用。

主要內容大概可以分為如下三個部分:

● 深度學習介紹;

● 神經網絡工作原理;

● 用 TensorFlow 實現(xiàn)圖像識別。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

深度學習介紹

我們知道深度學習現(xiàn)在是已經是一個非常熱門的技術,那大家第一次聽到這個深度學習的時候呢?很有可能就是因為去年這個時候 AlphaGo 戰(zhàn)勝李世石的這個事情。當時這個事情獲得了全社會的廣泛關注和熱烈討論。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

但其實 AlphaGo 并不是第一個戰(zhàn)勝人類的智能機器人,早在 20 年前就有過 IBM 深藍機器人戰(zhàn)勝人類國際象棋冠軍的記錄。那為什么 AlphaGo 可以引發(fā)這么大的關注呢?

我認為原因有兩個方面:一是圍棋的復雜度遠超國際象棋;二是因為深度學習技術的發(fā)展,它推動了不僅是一個 AlphaGo 這樣的應用程序,它其實也推動了各個方面的人工智能的應用。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

例如谷歌的無人車項目,就是一個距離我們更近的例子。大家都知道,現(xiàn)在無論在國內還是國外,堵車和停車的問題其實都是很嚴重的。但是如果有了無人車這樣一個工具,就能大大提升車主的用戶體驗。

正是因為深度學習技術在 AlphaGo 和無人車等項目背后的巨大推動力,才使得這些項目能夠發(fā)展到目前這樣一個比較高的水平。

但其實,深度學習技術并不是一個新技術,它的起源可以追溯到幾十年前,只是這兩年才得到了一個比較快速的發(fā)展。如圖中所示的搜索熱度變化圖也能看出,從 2012 年到 2016 年,深度學習這個詞的受關注程度是處于一個指數(shù)級增長的狀態(tài)。那為什么會在 2012 年這個時間點出現(xiàn)這樣的一個增長呢?其實是因為 ImageNet 這樣一個圖像識別的比賽。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

ImageNet 是由李飛飛教授發(fā)起的一個著名的圖像識別數(shù)據(jù)集,里面包括了各種各樣的圖片,然后參賽者需要將物體從圖片中標記出來,做一個分類。這個比賽每年都會舉辦,而且每次的比賽細節(jié)都會有所不同。然后在 2012 年的時候,由于深度學習的作用,比賽結果產生了一個巨大突破。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

從下圖可以看出,在 2012 年之前,采用了傳統(tǒng)分類算法的時候,錯誤率大概是 26% 左右。而且我們可以看到這個錯誤率的變化趨勢非常緩慢,也就是說要減低一點錯誤率,就必須付出巨大的努力。但是在引入深度學習算法之后,從 2011 到 2012 年,使得錯誤率從 26% 一下子降低到了 16%,并且從 2012 年開始的這三四年中,錯誤率還在以每年 4% 左右的一個速度在降低。到 2015 年,機器的識別率已經接近了人類的水平,即 5.1% 的錯誤率。2016 年,機器最新的識別正確率已經達到了 97% ,錯誤率達到了 3% 左右,已經比人類好得多。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

如下圖是才云科技集成 Google 訓練好的一個模型,它可以通過分析用戶上傳的圖片,例如一頭牛,然后分析出這頭牛是某個品種的概率是多少。還有現(xiàn)在大家在 Google 或者百度上傳一張圖片,然后搜索引擎就能比較精確地告訴你這個圖片里的主體是什么動物,或者什么植物,甚至還能提供一段簡單的文字描述等等。其實這些都是基于深度學習的算法來實現(xiàn)的。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

除了圖像識別之外,其實深度學習的早期應用是數(shù)字識別。例如圖中所示的這個就是 1998 年的時候 Yann LeCun 教授做的一個手寫體數(shù)字識別的項目(如下圖所示),用的就是深度學習技術。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

此外還有 Google 在地圖上的應用,能夠通過圖像識別自動定位門牌號和地理位置等信息。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

其實神經網絡,也就是深度學習技術用在圖像識別的應用還有很多,包括人臉識別、安防領域、火警、群眾事件,還有現(xiàn)在的美顏等等。并且,受到神經網絡思想的啟發(fā),目前包括語音識別、機器翻譯、自然語言處理和大數(shù)據(jù)分析、預測等行業(yè)都得到一個比較大的發(fā)展。

神經網絡原理

下面簡單介紹一下神經網絡的情況。

這里我不會去推導前向傳播或者反向傳播的具體過程。前向傳播的過程比較簡單,這里會做一個大致的介紹。而反向傳播對數(shù)學的要求比較高,并且通過 TensorFlow 可以非常容易地去實現(xiàn),因此我只會簡單介紹一下基本原理,大家自己有興趣的話可以自己去深挖。這個部分我主要還是做一些流程上的介紹,讓大家知道一個完整的機器學習或者說圖像識別問題,我該怎樣一步一步地去解決它,包括我需要做哪些事,什么事情可以通過什么工具來幫助我實現(xiàn)。

首先我們來介紹一下什么是深度學習。大家可能經常會聽到深度學習和神經網絡這些詞,但它們之間究竟是一個什么關系呢?其實,深度學習在維基百科上的定義是:多層的非線性變換的一個算法合集。那怎樣實現(xiàn)這個多層非線性變換呢?最好最方便的一種方法就是神經網絡。所以說基本上當前來講的深度學習,就等于是深層神經網絡的一個代名詞。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

神經網絡,大家從這個詞就能看出它多多少少跟人腦的神經網絡有些關聯(lián)。如圖所示,左上角就是一個神經元的模型,他包括很多不同的輸入,以及一個軸殼來處理這些輸入,最終得到一個輸出。這個對應到人工神經網絡也是一樣的,它會有多個輸入,然后經過一些變換得到輸出。但人腦的變換函數(shù)具體是怎樣的,現(xiàn)在還弄不清楚,我們只能通過這樣一組加權和,加上一個激活函數(shù)來模擬人腦。

大家都知道,人腦是通過這種神經網絡的網絡狀結構處理信息的,因此在人工神經網絡結構中也是通過這樣的一種多層結構來實現(xiàn)神經元的連接。如上圖的右下角所示,每一個圓圈都代表一個神經元,多個輸入,一個輸出,上一層的輸出作為下一層的輸入。

下面我簡單介紹一下怎么用這個網絡結構來處理問題。比如數(shù)字識別問題,如圖所示的數(shù)字圖像在計算機里就是一個像素矩陣,然后每個矩陣元素里面都是各種各樣的一個數(shù)字,我們把這些數(shù)字作為這個神經網絡的輸入層提供進來,然后通過不同結構的神經網絡處理,從輸入層到隱藏層再到輸出層,就可以得到處理結果。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

比如圖中的這個手寫數(shù)字問題,其實就是要識別這個數(shù)字到底和 0 到 9 中的哪個數(shù)字更像一點。我們可以安排輸出層有 10 個結點,分別代表 0 到 9 的 10 個數(shù)字。那么如果這個圖像是 1 的話,我們就希望代表 1 的這個結點輸出的結果是 1 ,其他的結點是 0 。這樣的話假設我們輸入一張圖像,然后發(fā)現(xiàn)代表數(shù)字 7 的結點輸出為 1,其他結點為 0 ,那么我們就等于識別出了這個圖像的內容是 7,也就完成了一個數(shù)字識別的任務。

這只是一個最簡單的例子,還有更多更復雜的神經網絡這里我們就不做具體介紹了,感興趣的朋友可以關注才云科技開源的一個代碼庫,里面有各種豐富的樣例代碼。(雷鋒網注:開源地址見下文鏈接)

下面簡單介紹一下深度學習的兩個大的分類:監(jiān)督學習和非監(jiān)督學習。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

我通常會把機器學習和人類學習來做一個對比,其實有很多地方都是比較類似的。例如我們小時候去上課,然后考試。其實機器學習也是一個類似的過程,它通過海量的數(shù)據(jù),然后學習(總結)出一些對應的規(guī)律,并將規(guī)律應用在一個測試環(huán)境上,就能得到一個諸如正確率這樣的評測指標,最終通過評測指標來評測一個機器學習算法的好壞。

那么在監(jiān)督學習的場景中,通過海量的標記過的數(shù)據(jù),就相當于人類在學習中通過大量的做題,然后每做一個題都知道對錯,沒有錯的話就加強這個過程,有錯的話就反向改進,這就是監(jiān)督學習。

而非監(jiān)督式就不需要人為的標簽數(shù)據(jù),它是監(jiān)督式和強化學習等策略之外的一個選擇。典型的非監(jiān)督學習有聚類等,它是直接從數(shù)據(jù)中尋找相似性,即規(guī)律。

現(xiàn)在其實機器學習除了監(jiān)督式和非監(jiān)督式之外,還有增強學習。它是和監(jiān)督式及非監(jiān)督式都有些不同的一種方式。然后,但其實在工業(yè)界用得最多的,其實還是監(jiān)督式學習的方式,非監(jiān)督式和增強學習現(xiàn)在在工業(yè)界的使用還是相對比較少。那其實我們今天也會主要以監(jiān)督式的這種學習方式作為一個樣例,來告訴大家怎樣去完成一個監(jiān)督式的學習方法來完成圖像識別工作。

在具體介紹整個模型之前,這里我先跟大家詳細介紹一下神經網絡的工作原理。

剛剛講到,我們要去做一個圖像分類模塊,就相當于是把這個圖像的原始的像素矩陣傳入輸入層,然后經過一層一層的推導,得到輸出層。那其實神經網絡里面一個最關鍵的部分,就是說我怎樣通過一層一層的網絡結構來得到從輸入層到輸出層的結果。最簡單的來講,我們先要知道一個單一的神經元的工作方式。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

如圖所示,我們其實可以將每個神經元視為這樣的一個多項式組合,w表示權重,b表示偏移量。那么訓練時一個最重要的工作就是找到最合適的權重,使得我們的實際輸出與預想輸出一致。那么輸入的一個加權平均,加一個偏移,最后再通過一個激活函數(shù),最后就能得到輸出。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

這里我們以一個判斷零件是否合格的例子來講解,注意這里省略了偏移量和激活函數(shù)。比如說我這里的每一個零件它都會有長度、質量等參數(shù),就相當于收集了很多關于這個零件的數(shù)據(jù),其中有一些我們知道是已經合格了的,也就相當于有了一個訓練數(shù)據(jù)。將這些訓練數(shù)據(jù)輸入模型,通過結果對比不斷調節(jié)隱藏層的權重參數(shù),最終達到一定的正確率之后,也就是完成了模型訓練。接著我們可以測量任意一個零件的參數(shù),把測量數(shù)據(jù)輸入神經網絡,就能判斷這個零件是否合格。

這樣的一個過程其實就是正向傳播的一個過程。反向傳播相當于是我知道一個零件的長度和質量,也知道它是否合格的時候,再去根據(jù)這個目標做一個反向的回饋。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

這里我列出了一些簡單的激活函數(shù),注意這里所有的激活函數(shù)都是非線性的函數(shù)。如果一個模型沒有激活函數(shù)的話,就相當于是所有線性過程的疊加,不論模型有多少層,疊加出來還是一個線性過程,也就是模型沒有涉及非線性的因素,也就不會有實際的應用。而激活函數(shù)就是一個提供非線性過程的因子,有了激活函數(shù)我們才能完成一個非線性變化的過程。

更詳細的內容大家可以參考《TensorFlow:實戰(zhàn)Google深度學習框架》這本書。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

這里我們介紹兩種常用的激活函數(shù):Softmax 和 Sigmoid。在多分類的問題中,經過層層的推導,其實每個節(jié)點的輸出都是不一定的。那么如果我們想得到一個概率分布,就需要用到 Softmax 這樣一個層。它相當于對每個輸出節(jié)點的大小作為置信度做一個歸一化的操作,然后使得每一個最終輸出節(jié)點的值都在 0 到 1 之間,這樣就等于輸出了一個概率分布。我們可以大概理解為不同的輸出類別的一個概率分布。在多分類問題中,一般都會用 Softmax 作為最后的處理層,得到一個概率分布情況。類似的,在二分類中我們通常使用 Sigmoid 函數(shù)。

這樣,從輸入層到隱藏層到輸出層再到激活函數(shù),我們等于介紹了全連接神經網絡的一個基本結構。剛剛提到,監(jiān)督學習就是我們得到一個結果之后,能夠判斷它的好壞。那么怎么判斷和評測呢,就需要損失函數(shù)。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

通過損失函數(shù),我們可以計算出實際輸出和真實標簽的差別,然后進行優(yōu)化,縮小這種差別。兩個經典的損失函數(shù)一個是交叉熵,另一個是 MSE 最小平方差。他們詳細的用法,包括自定義函數(shù)怎么樣去定義等內容,大家可以參考《TensorFlow:實戰(zhàn)Google深度學習框架》這本書。

定義完損失函數(shù),我們再來講講優(yōu)化。

首先,優(yōu)化的是什么?我們剛剛提到,神經網絡里的每一個神經元都有參數(shù),我們要優(yōu)化就是這些參數(shù)。那怎樣來優(yōu)化呢?就是通過我們定義的損失函數(shù),即推導得出的結果要跟真實結果越接近越好。這相當于變成了一個最小化問題。最小化問題確實有比較成熟的數(shù)學解法。但對于神經網絡這么復雜的一個結構,它其實并沒有特別好的數(shù)學公式能夠直接求解。

雖然說,優(yōu)化神經網絡的算法有不少,但主體的思想其實都是基于梯度下降,或者隨機梯度下降。那么,梯度下降是什么?用簡單的話來講,它就相當于是把不同參數(shù)的取值和損失函數(shù)的大小,看成空間中的一個曲面。最簡單的情況下,可看成二維空間上的一條曲線。任意一個參數(shù)的取值,就對應了損失函數(shù)的取值。這樣子的話,我們就可以通過計算它的梯度來修改參數(shù),使得損失函數(shù)會往更小的這樣一個方向去發(fā)展。這就是優(yōu)化神經網絡的最基本的思想。包括反向傳播算法,其實也就是怎么更快地去計算出每一個參數(shù)的梯度,使得計算的時間復雜度減少。優(yōu)化神經網絡的核心思想其實還是梯度下降。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

梯度下降是在所有的數(shù)據(jù)集上去算它的梯度。但神經網絡的數(shù)據(jù)量一般會比較大,一般很難把所有的數(shù)據(jù)全都用上。這樣的時候,我們一般會采用 minibatch。一次計算部分的梯度來減少計算量。本來我們就知道,梯度下降其實就已經無法達到全局最優(yōu)值。那使用隨機梯度下降呢,其實就更加難以保證達到最小值,有全部訓練數(shù)據(jù)集才能有最小值。但我們可以通過調整學習率,使它更加逼近極小值。

這些就是我想給大家講的,神經網絡的大致工作原理。其實這個工作原理講得比較粗淺,也比較 high-level。但大部分人其實對主要的一些部分了解就 OK 了。

用 TensorFlow 實現(xiàn)圖像識別

接下來,我會把這些原理對應到具體的代碼里面,然后讓大家知道怎么樣通過 TensorFlow 來實現(xiàn)圖像識別。同時講解怎么用 TensorFlow 來實現(xiàn)大致的機器學習分類算法。

雖然上面有很多的細節(jié)沒有覆蓋,但其實 TensorFlow 也把這樣的一些細節(jié)給屏蔽掉了。我的意思是,其實大家只需要理解一些比較 high-level 的東西,就完全能夠通過 TensorFlow 來實現(xiàn)神經網絡的訓練。

我們先談什么是 TensorFlow,為什么要選擇 TensorFlow。

TensorFlow 是谷歌在 2015 年底開源的一個深度學習框架。雖然說是深度學習,官方來講,其實 Google 希望把它做成一個計算工具。但這個計算工具的主要任務,就是用來實現(xiàn)深度學習算法。所以說,其他的功能我們暫時也就拋開不談。就深度學習的基本功能來講,TensorFlow 已經得到廣泛的應用。Google自不必提,現(xiàn)在所有 Google 內部的深度學習系統(tǒng)全都是基于TensorFlow。DeepMind 賣了之后,推出的東西也都會基于TensorFlow。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

Google 之外,國內包括華為、京東、小米,其實都在用 TensorFlow。國外像 Twitter、Uber、Snapchat 也在用。使用它的公司其實非常多?,F(xiàn)在學術界也好,工業(yè)界也好,都偏向使用它。為什么 TensorFlow 會這么受歡迎?除了有大公司的背書,社區(qū)的貢獻度也是非常重要的一個參考指標。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

在 GitHub,無論是從 star 的數(shù)量,fork 的數(shù)量,還是從 issues 和 pull request, TensorFlow 都遙遙領先于其他同類深度學習開源框架。對于深度學習來講,它還是一門正在發(fā)展中的技術。對于工具來講,我們認為,它是否能夠跟上這門技術的發(fā)展,其實是非常重要的一個考核標準。就是說,因為技術的發(fā)展是非??斓?,如果工具的發(fā)展落后于技術的發(fā)展,它就會有一個被淘汰的風險。所以說,當它的社區(qū)活躍度非常高的時候,這個風險度就會相應的降低。因此我們比較推薦使用 TensorFlow。對于新手來講,我們也比較推薦。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

這里給出了一個簡單的 TensorFlow 的 Hello World 的程序,實現(xiàn)了一個簡單的向量加法的操作。首先 import 了 TensorFlow ,然后定義了 a、b 兩個向量,包括 name 屬性,接著把它們加起來。這里 TensorFlow 采用了這樣的一個惰性計算模型,輸出的并不是加法的結果,而是結果的一個引用。另外,要運行整個 result 運算,就必須定義一個 session ,session 會掌握所有 TensorFlow 的運算資源,然后通過 session 運行相關操作。

這里只是簡單介紹了一個 TensorFlow 的簡單用法,由于時間有限,也無法深入地去詳細介紹。我們關注的是如何用 TensorFlow 實現(xiàn)一個神經網絡的全連接,也就是加權和,加上激活函數(shù)的模型。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

加權和可以通過矩陣乘法的方式實現(xiàn)。如上圖代碼所示,這里通過 placeholder 的方法定義了一個 input ,其中類型是必須的,其他的諸如 shape 等參數(shù)則可以等使用的時候再賦值。之后定義了權重 w 和偏移量 b,這里是通過 Variable 方法定義的,這樣等最后優(yōu)化的時候,TensorFlow 會針對這些 Variable 展開優(yōu)化。最后通過乘法和加法操作,也就是通過 output = tf.nn.relu(tf.matmul(x, w) + b) 這一行代碼就實現(xiàn)了神經網絡的基本結構。

這里是通過基礎的 TensorFlow API 實現(xiàn)的,如果通過 Keras 等更高層的封裝來實現(xiàn)會更加簡單。這里我們是從基礎的 API 入手來進行講解,如果大家對高層封裝感興趣,可以自己學習。需要指出的是,其實高層封裝和基礎 API 的主要區(qū)別是實現(xiàn)上的區(qū)別,他們整體上的過程是基本一樣的。

下面我們來看一下如何用 TensorFlow 實現(xiàn)一個具體的圖像識別模塊,即從 MNIST 數(shù)據(jù)集中識別手寫數(shù)字。(完整代碼見下文鏈接)

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

可以看到,TensorFlow 通過 read_data_sets 方法對引用數(shù)據(jù)進行了一個非常好的封裝,后續(xù)可以通過非常簡單的方式讀取這些劃分好的數(shù)據(jù)集,例如通過 train、validation、test 等關鍵詞就可以讀取訓練和測試數(shù)據(jù)集等。

如下圖所示,然后是通過 next_batch 來獲取一小批的訓練數(shù)據(jù)。我們剛剛提到,在利用梯度下降算法時需要在所有的訓練數(shù)據(jù)上計算梯度,但是計算量太大了,因此這里通過 next_batch 方法,相當于我們在所有的訓練數(shù)據(jù)集中篩選一部分,隨機選取一部分訓練數(shù)據(jù)集,提供到神經網絡的輸入層,然后通過反向迭代方法去優(yōu)化這個神經網絡。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

這里 xx 設置等于 100,也就是我們得到了 xs 和 ys 兩個矩陣,xs 代表輸入數(shù)組,相當于把一個 28×28 的手寫圖像展開成一個長度為 748 的一維數(shù)組。ys 相當于我們的結果,也就是 0-9 這 10 種可能值。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

如上圖,完了之后是一個前向傳播的一個大致過程的程序截圖。這個過程就相當于是定義一層一層的神經網絡結構,這里 inference 函數(shù)中的 input_tensor 相當于輸入矩陣,后面的 reqularizer 就相當于一個正則化的東西。我們可以看到,當輸入來了之后,程序開始進行一層一層的推導,定義一層一層的權重和偏移量,算出每一層的結果,傳入下一層,進入下一層的計算。

其實通過這個前項傳播的定義我們可以看到,無論是全連接層還是卷積神經網絡,甚至是循環(huán)神經網絡,它的大致流程都是一樣的,給定輸入,然后通過一層一層的傳遞就可以得到最后的輸出。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

如上圖,下面我們看一下主程序。其實主程序就是調用了 train 的過程,這個 train 的過程其實也是比較簡單的。第一部分是定義輸入,也就是怎樣來提供這個訓練數(shù)據(jù)的接口,也就是通過 placeholder 的方式導入,輸入這里是 x ,輸出是 y_ 。然后通過調用 inference 函數(shù)來進行一個前向傳播的計算。然后定義了滑動平均和損失函數(shù)。

這里的過程其實是就相當于是:我通過輸入一個訓練數(shù)據(jù)集,然后得到在當前數(shù)據(jù)集下的推導結果,然后再通過這個推導結果和正確答案對比,就知道跟正確答案的差別在哪。下一步可以看到我們定義了 loss ,它相當于評估當前模型好壞的一個指標。這里其實就相當于是評價 cross_entropy 加上正則化,這里正則化是為了避免過耦合的。

完了之后,下一行是通過 GradientDescentOptimizer 函數(shù)優(yōu)化。TensorFlow 提供了大概 5-7 中不同的優(yōu)化函數(shù)可供選擇,它們針對不同的應用場景,各具特點,大家可以靈活選擇。這里我認為,對于那些不搞學術研究的同學,其實沒有必要去從數(shù)學的角度推導每一個優(yōu)化函數(shù)具體是怎么優(yōu)化的,從應用層的角度來看,大部分用戶只需要提供學習率和目標函數(shù),并且了解這些優(yōu)化函數(shù)的優(yōu)劣就可以了,這個相對來說還是比較方便。

在把所有的這些計算方式都定義好了之后,下面就是生成 TensorFlow 的計算圖,以及生成 session。定義好 session 之后,下面訓練的過程就比較簡單了,其實就是寫了一個循環(huán),每次選取一小部分訓練數(shù)據(jù),然后去做訓練,隔一段時間再打印一下訓練結果,整個過程就完成了。

所以說整個用 Tensorflow 來實現(xiàn)一個神經網絡的過程,相對還是比較簡單的。需要注意的是,這里我介紹的只是原生態(tài)的 TensorFlow,如果大家要去使用 TFLearn,或者 Keras 這些高級封裝去實現(xiàn) MNIST 問題的話,可能會更加簡單,大概只需要 2-3 行代碼就可以解決了。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

這里我們基本上把通過原生態(tài)的 Tensorflow 生成神經網絡的過程為大家介紹了一下。其實后面還有個 evaluate 評估的部分(代碼如上圖所示),因為時間關系我就不對著代碼詳細講了,感興趣的同學可以自己下去研究(源碼見下文鏈接)。

下面我再跟大家再介紹一下循環(huán)卷積神經網絡。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

剛剛大家看到的這個結構是一個全鏈接的神經網絡,在圖像處理的過程中,使用全連接神經網絡最大的一個問題就是它的參數(shù)太多了,這個問題可能會導致模型最終訓練不好。

例如,經常發(fā)生的,當你的訓練數(shù)據(jù)不足的時候,參數(shù)又太多,你就可能訓練不出來。一個非常簡單的例子,大家可以想象 N 元的一個方程組,然后我們假設只有 N 個數(shù)據(jù),并且這些數(shù)據(jù)是完全可分的,也就是我們是可以完全求解。但完全求解可能會導致過擬合,因為訓練數(shù)據(jù)在真實環(huán)境下都是有噪音的,也就是沒有辦法做到完全避免隨機因素的影響。在這種情況下如果你過于貼合訓練數(shù)據(jù),那么就有可能沒有辦法去收斂到未知的數(shù)據(jù)。

所以這就是參數(shù)過多可能引發(fā)的問題,即過擬合和訓練不出來。那怎樣去解決這兩個問題呢?卷積神經網絡就是一個很好的方法。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

卷積神經網絡就相當于是采用一個內核,即一個規(guī)模較小的矩陣,去處理一個比較小的區(qū)域,然后去通過移動這個小矩陣,去處理不同的這個塊。這種方式一個直觀的一個意義就是:一般的圖像上相鄰區(qū)域的內容是相似的。然后通過這樣的一個潛在的東西,就可以去把一個淺層的表達變成一個更深層的表達。也就是相當于自動從圖像中去提取特征。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

例如上圖所示,第一層可能可以從圖像中提取一些線條和斑點,第二層提取一些更復雜的性狀。第三層和第四層,層數(shù)越多,提取的特征就會越復雜。然后通過最后提取出來的這樣一些特征,我們再去做一個全連接的分類,最后這個分類的效果也就會更好。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

然后這里給出了一個簡單的 LeNet5 的模型,我們可以看到他的大致結構就是從輸入層,經過不斷地卷積池化,再經過 1 到 3 層不等的全連接層,最后得到輸出層。其實現(xiàn)在很多的卷積神經網絡基本上也都保留了這樣的一種結構。

除了這種模型之外,另一種比較特殊的模型是 Google Inception 模型,這里因為時間關系我也不去做過多的介紹了。

然后我在這里給出了一個簡單的用 TensorFlow 的程序來實現(xiàn)卷積層。通過代碼其實大家也可以看到,在這個框架里面,無論是全連接的神經網絡也好,還是卷積神經網絡也好,甚至循環(huán)神經網絡也好。它們的訓練過程,以及前面的準備過程其實基本上都是差不多的,你基本上只要去修改,怎么樣去從輸入得到輸出就可以了。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

從代碼也可以看到,開始是定義這個卷積層中的權重和偏移量,完了之后 TensorFlow 會對這個卷積層有一個封裝,然后通過 conv2d 函數(shù)得到一個 2D 的卷積層,然后再把偏移量、激活函數(shù)加上去。大家可以看到整個的過程還是比較簡單的,同樣的,如果用 Keras 等更高級的封裝來實現(xiàn)的化會更加簡單。

最后我要推薦一下《TensorFlow:實戰(zhàn)Google深度學習框架》這本書,今天講的內容,包括一些略去的內容,基本上全部在這本書里都有非常詳細的介紹。

另外,前面提到的代碼地址如下:

https://github.com/caicloud/tensorflow-tutorial 

代碼庫里包含了書中所有的樣例代碼,此外還包括了才云科技提供的 TensorFlow as a Service (TaaS) 深度學習平臺的一些教程和代碼,包括后面我們做的一些圖像分類和圖像識別的樣例代碼,后面也都會陸陸續(xù)續(xù)添加進去。大家有興趣的化可以關注一下這個代碼庫。

今天的分享就到這里,謝謝大家!

  群友問題解答

問題1:麻煩老師推薦下 Coursera 的機器學習公開課?

答:吳恩達的“機器學習 Machine Learning”非常值得推薦的,那門課我個人至少看了兩到三遍,而且在不同的階段看都會有不同的感受。

網址:https://www.coursera.org/learn/machine-learning 

編者按:更多機器學習的精品公開課匯總,詳見雷鋒網相關文章“開發(fā)者入門必讀:最值得看的十大機器學習公開課”。

文章鏈接:http://www.ozgbdpf.cn/news/201701/0milWCyQO4ZbBvuW.html 

問題2:請問 TensorFlow 相比較 Keras 有什么優(yōu)勢?

答:Keras 是對于 TensorFlow 一個更高層的封裝,它幾乎可以實現(xiàn) TensorFlow 的所有功能,TensorFlow 則是更底層更加靈活的一個工具,相對來說 TensorFlow 的功能可能更全。但 Keras 一個最大的問題在于,目前不支持分布式,我們希望 Keras 在未來的版本更新中能夠加入相關的特性支持。學習的話,可以先從 Keras 入手,因為它和 TensorFlow 沒有本質的區(qū)別,它只是 TensorFlow 的一個高層封裝,寫起代碼來會更加方便。

問題3:AI 學習最主要的是算法和建模對不對呀?

答:算法和模型只是一個方面,但其實我還是比較推薦做一些實戰(zhàn)的應用,關鍵還是看你要做什么事情。如果你是要做學術研究,那就要多看論文,如果你是要做工程或者要找工作的話,建議你多做一些 Kaggle 的比賽。

問題4:TensorFlow 在推薦系統(tǒng)上的運用如何?

答:TensorFlow 官方有一個 Wide & Deep 的教程,是關于谷歌 App 推薦的一些內容,可以關注一下。TensorFlow 是一個兼容的框架,可以被應用在許多問題上,其實更多的是關于深度學習技術的應用,現(xiàn)在學術界有許多相關的研究,大家可以關注一下。

Wide & Deep 鏈接:https://www.tensorflow.org/tutorials/wide_and_deep 

問題5:請問 TensorFlow 相比較 Caffe 有什么不同?

答:TensorFlow 是一個相對更全面的工具,但是在圖像處理上它的表現(xiàn)不如 Caffe 成熟,處理速度也會稍微慢一點。TensorFlow 相比 Caffe 的優(yōu)點是支持分布式,而且發(fā)展的速度也比 Caffe 更快。

問題6:TensorFlow 實質是通過大量訓練數(shù)據(jù)(監(jiān)督學習)和神經網絡算法,實現(xiàn)深度學習過程。未來能不能不需要大量訓練數(shù)據(jù),即非監(jiān)督學習的辦法就可以實現(xiàn)深度學習的過程或工具,Google 等巨頭有這方面的嘗試或計劃嗎?

答:非監(jiān)督式學習包括增強學習其實也有嘗試,它們其實也都可以通過 TensorFlow 來實現(xiàn),具體怎么做大家可以參考官網的教程。TensorFlow 主要還是提供了一個計算框架,可以實現(xiàn)和神經網絡相關的幾乎所有算法。

問題7:TensorFlow 既然支持分布式,那 TensorFlow On Spark 的意義還大嗎?

答:TensorFlow 支持的分布式其實只是一個計算框架,TensorFlow On Spark 的意義還是有的,但我覺得沒有 TensorFlow On Kubernetes 的意義大,Spark 主要是做了一個調度和管理的系統(tǒng),但是性能損失比較大,目前成熟的應用也比較少。大家如果想要了解更多分布式 TensorFlow 的內容,可以關注才云科技的平臺。

問題8:我目前在用 Caffe,想著要不要轉 TensorFlow,老師有什么建議么?

答:我覺得轉 TensorFlow 還是有意義的,主要還是你具體用 TensorFlow 來做什么??赡芤驗槲医佑| TensorFlow 比較多,但是我個人認為 Caffe 其實正處在一個慢慢的被淘汰的邊緣。而且目前客觀上講 TensorFlow 的確是一個無論在工業(yè)上還是學術上都非常流行的框架。

溫馨提示:需要原版 PPT 和視頻鏈接的朋友可以關注 AI 研習社公眾號(微信號:okweiwu),回復“鄭澤宇”即可。

雷峰網原創(chuàng)文章,未經授權禁止轉載。詳情見轉載須知。

從原理到代碼:大牛教你如何用 TensorFlow 親手搭建一套圖像識別模塊 | AI 研習社

分享:
相關文章

編輯

歡迎交流,微信:whl123465
當月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
立即設置 以后再說