谷歌I/O走进TensorFlow开源模型世界:从图像识别到语义理解
谷歌I/O走進TensorFlow開源模型世界:從圖像識別到語義理解
2017-05-23 16:13:11 ???TensorFlow??? 2?0?0一年一度的谷歌開發(fā)者大會 Google I/O 在山景城成功舉行,在首日的?Keynote 中,谷歌宣布了一系列新的硬件、應(yīng)用、基礎(chǔ)研究等。而作為 AI First 的開發(fā)者大會,Google I/O 也自然安排了許多有關(guān)機器學習開發(fā)的內(nèi)容,比如《教程 | 如何使用谷歌 Mobile Vision API 開發(fā)手機應(yīng)用》。當然毋庸置疑,TensorFlow 也是本屆 I/O 大會的關(guān)鍵核心之一。當?shù)貢r間 18 日下午,谷歌 TensorFlow 開發(fā)者支持 Josh Gordon 帶來了一場主題為《開源 TensorFlow 模型(Open Source TensorFlow Models)》的 Session,介紹了一些最流行的 TensorFlow 模型,并鼓勵了開源。機器之心在本文中對這一 Session 進行了整理介紹,其中部分內(nèi)容也提供了機器之心文章的參考鏈接,希望能為你的擴展閱讀提供幫助。
演講主題:你知道你可以使用 TensorFlow 來描述圖像、理解文本和生成藝術(shù)作品嗎?來這個演講,你體驗到 TensorFlow 在計算機視覺、自然語言處理和計算機藝術(shù)生成上的最新項目。我將分享每個領(lǐng)域內(nèi)我最偏愛的項目、展示你可以在家嘗試的實時演示以及分享你可以進一步學習的教育資源。這個演講不需要特定的機器學習背景。
在進入正題之前,Gordon 先談了談他對可復現(xiàn)的研究(reproducible research)的看法。他說我們現(xiàn)在理所當然地認為我們可以使用深度學習做到很多事情。在 2005 年的時候,他用了 6 個月時間試圖使用神經(jīng)網(wǎng)絡(luò)來做基本的圖像分類——識別分辨細胞是否感染了疾病。雖然那時候已經(jīng)有很多不錯的軟件庫可用了,但他們?nèi)匀贿€是要手動編寫許多神經(jīng)網(wǎng)絡(luò)代碼。最后,六個月時間過去了,這些優(yōu)秀工程師打造的網(wǎng)絡(luò)才開始在二元分類任務(wù)上表現(xiàn)得足夠好一點。
而今天,你再也不需要這么苦惱了。今天,一個優(yōu)秀的 Python 開發(fā)者加一點 TensorFlow 背景知識,并且愿意使用開源的模型,那么僅需要幾天時間就能實現(xiàn)遠遠超過之前 6 個月所能達到的效果。當然,這要歸功于大學、公司、開發(fā)者等慷慨的分享,這也已經(jīng)為我們的社會帶來了很大的價值。
Gordon 舉了一個例子說明。他說過去 8 個月有三種新的醫(yī)學圖像應(yīng)用都依賴于一種被稱為 Inception 的深度學習神經(jīng)網(wǎng)絡(luò)模型,這些應(yīng)用都實現(xiàn)了非常卓越的表現(xiàn),有望在人類的生命健康方面提供方便實用的幫助。機器之心對這三種應(yīng)用都進行過深度報道,參閱:
-
重磅 | 谷歌研發(fā)人工智能眼科醫(yī)生:用深度學習診斷預防失明
-
學界 | 斯坦福 Nature 論文宣布新突破:深度學習皮膚癌診斷達專家水平
-
業(yè)界 | 谷歌使用深度學習幫助病理學家檢測癌癥,算法得分高達 89%
既然深度學習這么有用?那么深度學習是怎么工作的呢?首先我們先來看看一個可以將圖像分類為「貓」或「狗」的模型。通過這個模型,我們可以看到深度學習與 Gordon 在 2005 年的工作有什么不同。
Gordon 解釋說,在 2005 年時,為了開發(fā)圖像分類器,他編寫了 Python 代碼來提取圖像的特征。首先他需要構(gòu)思這個圖像分類器需要怎樣的特征(比如:線、形狀、顏色),甚至還可能需要 OpenCV 這樣的庫來做人臉檢測。
而使用深度學習時,可以直接為模型輸入原始像素,讓模型自己去尋找分類所需的特征。「深度學習」之所以被稱為「深度」,是因為它具有多個層,數(shù)據(jù)在這些層中進行處理,最后得到分類結(jié)果,更多介紹可參閱《入門 | 智能時代每個人都應(yīng)該了解:什么是深度學習?》
TensorFlow 是由谷歌設(shè)計的一個深度學習框架,擁有很多優(yōu)點,包括快速靈活可擴展的開源機器學習庫、可用于研究和生產(chǎn)、可以運行在 CPU、GPU、TPU、安卓、iOS 和樹莓派等硬件和系統(tǒng)上。
Gordon 將在這個演講中為我們主要解讀以下 4 個重要研究:
當然,一直關(guān)注深度學習研究前沿的機器之心也已經(jīng)對這些研究進行過完整報道:
-
業(yè)界 | 谷歌開放 Inception-ResNet-v2:一種新的圖像分類卷積神經(jīng)網(wǎng)絡(luò)模型
-
業(yè)界 | 谷歌發(fā)布語言處理框架 SyntaxNet 升級版,識別率提高 25%
-
業(yè)界 | 谷歌 SyntaxNet 模型大升級,為 40 種語言帶來文本分割和詞態(tài)分析功能
-
深度 | 谷歌增強型風格遷移新算法:實現(xiàn)基于單個網(wǎng)絡(luò)的多種風格實時遷移(附論文)
此外,Gordon 還提到了一些其它使用 TensorFlow 實現(xiàn)的研究成果;
你想的沒錯,機器之心依然報道過這些研究:
-
業(yè)界 | 谷歌發(fā)布神經(jīng)音頻合成器 NSynth:專注于啟迪音樂創(chuàng)作
-
資源 | 谷歌官方開源 tf-seq2seq:一種通用編碼器-解碼器框架
-
重磅|谷歌開源最精確自然語言解析器 SyntaxNet 的深度解讀:一次關(guān)鍵進步以及一個重要工具
-
業(yè)界 | Show and Tell:谷歌在 TensorFlow 上開源圖像描述系統(tǒng)
-
業(yè)界 | 谷歌開源新的 TensorFlow 代碼,如何進行文本自動摘要
谷歌的這些研究中有一些仍然是當前最佳的,但他們?nèi)匀婚_源了相關(guān)的代碼,任何人都可以免費嘗試復現(xiàn)這些結(jié)果。那谷歌為什么還要開源呢?畢竟有的研究是非常具有商業(yè)價值的。Gordon 說:「一個重要的理由是可以激勵別人繼續(xù)推進你的想法?!雇瑫r,這也能幫助降低開發(fā)者的進入門檻,能讓更多人參與進來。
要實現(xiàn)可復現(xiàn)的(reproducible)開源,你需要共享你的代碼和數(shù)據(jù)集。代碼方面,要做到可復現(xiàn),你應(yīng)該共享你所有的代碼,包括訓練、推理和驗證的代碼。數(shù)據(jù)集方面,你應(yīng)該說明你所用的數(shù)據(jù)集,你對數(shù)據(jù)集的處理方式等等。最好能提供一個試用數(shù)據(jù)集(toy dataset),讓人們可以輕松驗證你的模型。
預訓練的檢查點(pretrained checkpoint)也很重要。pretrained checkpoint 是為了保存模型訓練過程中一些列狀態(tài),這樣其他研究者就可以完全復制之前的研究過程,從而避免被隨機化(在深度學習中極為常見)等其他因素干擾。
Gordon 還談到了 Docker。很多時候,你的開發(fā)環(huán)境需要大量的依賴包。通過共享一個 Docker 容器,你可以讓其他人快速嘗試你的想法。
開發(fā)深度學習模型,當然可以選擇自己寫代碼。在 TensorFlow 中,你可以輕松編寫代碼,實現(xiàn)模型。這里給出了兩個示例:
這段代碼使用 Keras + TensorFlow 的組合。Keras 是用來構(gòu)建神經(jīng)網(wǎng)絡(luò)的 API,它具有簡單高效的特性,允許初學者輕松地建立神經(jīng)網(wǎng)絡(luò)模型;同時,Keras 也可以使用 TensorFlow 作為運行的后端,極大地加速了開發(fā)與訓練的過程。
首先我們使用 Keras 中的 Sequential 類初始化一個用于存放任意層網(wǎng)絡(luò)的模型,我們可以簡單地認為這個類創(chuàng)建了一個杯子,我們的任務(wù)就是用適當?shù)膬?nèi)容將這個杯子填滿。接著在代碼中不斷地調(diào)用 add 方法按照順序添加我們需要的神經(jīng)網(wǎng)絡(luò)層 (layer)。我們可以看到短短的幾行代碼便可以創(chuàng)建一個 MNIST 神經(jīng)網(wǎng)絡(luò)分類器。你只需要專注于以下幾個方面:將數(shù)據(jù)按照神經(jīng)網(wǎng)絡(luò)的輸入(代碼中為一行 model.add(Dense(512, activation='relu', input_shape=(784,)))格式處理好,選擇適當?shù)募せ詈瘮?shù)(不僅是 relu,你也可以嘗試 tanh 或是 softmax 來快速比較不同激活函數(shù)對神經(jīng)網(wǎng)絡(luò)結(jié)果的影響),是否添加 Dropout 層來減輕學習過程中的過擬合現(xiàn)象。
當模型構(gòu)建好之后,我們便可以快速地使用 compile 方法來編譯模型,其中的損失函數(shù) loss、優(yōu)化方法 optimizer 均可以自由選擇。最后,使用類似于 sklearn 機器學習工具包中的 fit 方法即可開始訓練我們的模型。
TensorFlow 有一個非常出色可視化工具 TensorBoard,可以協(xié)助你的開發(fā)。
除了自己動手開發(fā),你也可以利用別人寫好的代碼,這也是開源的好處,也是本演講所關(guān)注的重點。
Inception
Gordon 首先介紹的模型是 Inception。
Inception 的結(jié)構(gòu)
比如如果你想識別一張照片,你可以直接在谷歌的云平臺上直接調(diào)用該模型的 API 來幫你完成。當然,你可以通過使用開源模型的方式來實現(xiàn):
上面的這一點代碼就實現(xiàn)了前面幻燈片上的 Inception 模型,可以看到,代碼量非常少。
這是該模型在 Gordon 自己拍攝的一張照片上所得到的結(jié)果。效果不好,主要是因為這個模型所預訓練的數(shù)據(jù)集來自于 ImageNet。ImageNet 中包含了大量的圖像,但其中大部分都是貓、狗、花、藝術(shù)品等等,對上圖照片的場景經(jīng)驗不足。
而有了合適的數(shù)據(jù)集,Inception 能得到非常好的表現(xiàn),甚至能夠分辨出狗的品種。
也許你對識別狗不感興趣,但你也可以用深度學習做其它事情,比如遷移學習。遷移學習的概念很簡單。舉個例子,假如你已經(jīng)訓練好了一個可以識別狗的模型,但你想要識別上面照片中的城市。如果有遷移學習,你就不需要從頭開始在新數(shù)據(jù)集上訓練你的模型,你可以去掉你原來模型的最后一層,然后換上新的一層再訓練。這樣就能將原來需要數(shù)周的訓練時間減省到了幾十秒。
TensorFlow for Poets 展示這樣實現(xiàn)圖像模型的方式。希望在更多領(lǐng)域看到這樣的例子。實際上,在 https://github.com/tensorflow/models 中,有很多模型公開可用。
你也可以設(shè)計你自己的實驗。
接下來,Gordon 對大名鼎鼎的 Deep Dream 進行了介紹。參閱機器之心文章《深度 | 揭秘谷歌 Deep Dream 的前世今生》。
Deep Dream 何以成為可能。Gordon 解釋說,一是因為數(shù)據(jù)和計算機計算能力的極大增長,而是因為人們設(shè)計出了更加有效的算法,三是這些算法能自動學習到合適的特征(feature)。
要提取出圖像的特征,我們需要用到卷積。卷積就像是一個濾波器。比如下圖,左邊是一張曼哈頓的照片,中間是一個 3×3 的濾波器,右邊是處理后的圖像,只能大概看到一些建筑的邊。
如果你查看 Deep Dream 的代碼,你會看到很多,下面給出了其中一些關(guān)鍵的代碼:首先我們從卷積神經(jīng)網(wǎng)絡(luò)中的某一層中選出一些列 filter(不同的 filter 會包含是分不同的特征:如貓、狗、甚至是梵高的向日葵,這取決于你用什么內(nèi)容來訓練),接著利用這些 filter 定義好損失函數(shù),不斷地利用 TensorFlow 中自動求導的功能更新原先的圖片。通過這幾行代碼,我們委托 TensorFlow 不斷地找出原始圖片中的一些區(qū)域(這些區(qū)域的特征恰好與某些 filter 匹配),接著 TensorFlow 利用 filter 的信息來修改原始的圖片從而生成 DeepDream 的效果。
使用深度學習,你還能做風格遷移。對此 Gordon 并未做太多介紹,感興趣的讀者可參閱《神經(jīng)風格遷移研究概述:從當前研究到未來方向(附論文和代碼)》。在這里,Gordon 順帶提及了一下 Magenta,參閱《深度 | 人工智能改變 MIDI 創(chuàng)作:谷歌 Magenta 項目是如何教神經(jīng)網(wǎng)絡(luò)編寫音樂的?》
風格遷移即是將一張藝術(shù)畫作的風格應(yīng)用到一張照片的內(nèi)容上,處理流程如下所示:
而且值得注意的是,現(xiàn)在你已經(jīng)可以實時地給視頻執(zhí)行風格遷移了!
語言
語言也是一個非常重要的領(lǐng)域。Gordon 將為我們講解 SyntaxNet 系列,其中最新的是 Parsey Saurus,這也是目前最準確的文本處理器之一。同樣,這也是開源的,可以通過 TensorFlow 使用。那么模型是怎么處理文本的呢?Gordon 用例子進行了說明。
假設(shè)有一個句子「I love NYC.」你可以使用谷歌云的自然語言 API 來對這個句子進行處理,可以拖拽式地操作。
當然,你也可以在 TensorFlow 中使用 Docker 安裝環(huán)境,快速地嘗試 SyntaxNet。
還記得去年的 Parsey McParseface,那是當時最先進的自然語言處理模型,而現(xiàn)在 Parsey Saurus 已經(jīng)超越了它。這兩者的區(qū)別在于 Parsey McParseface 是在詞層面上工作的,而 Parsey Saurus 則是工作在字符的層面上。在字符層面上的學習允許模型更加精細的處理文字,例如可以學習到詞素這樣最小單位的語言信息或是更好地處理生僻的字詞。
使用這些模型,你甚至可以像人一樣分析沒有實際意義語句的結(jié)構(gòu),比如:「The gostak distims the doshes.」這個句子是毫無意義的,但我們卻能夠理解這個句子的結(jié)構(gòu)。比如說,我們能夠輕松理解其中各個詞的詞性,比如我們知道 distims 是動詞,而 gostak 和 doshes 則是名詞。
在 syntaxnet container 中,使用 Interactive Text Analyzer 也能得到同樣的結(jié)論。
你也可以詢問 distims 這個動作的執(zhí)行者是什么?
Parsey Saurus 還能告訴你更多。
下面列出了對該句子的一些分析結(jié)果:
也可以得到該句子的依存樹:
除此之外,你還可以下載在不同語言(40 多種)上預訓練過的模型。這正是開源的價值。
這個有很多非常好的用例。
-
如果有一個已有的系統(tǒng),你可以更輕松地在這之上實現(xiàn)提升。
-
你可以將其用作一個新系統(tǒng)的基礎(chǔ)。讓你不需要再重頭開始訓練,就能獲得已有的詞性標注等功能。
然后,Gordon 又簡單介紹了 Release++ 的概念。這個概念來自 Magenta 的博客,表示他們不僅共享了自己的代碼,還提供了預訓練的模型和 Docker 容器。也就是說,你可以直接使用他們的模型達到同樣的效果。
開源為 TensorFlow 帶來的一大優(yōu)勢是其具有非常多的學習資源,包括許多課程、博客、教程,你可以訪問其官網(wǎng)查閱。另外,這里 Gordon 推薦了幾個值得關(guān)注的:
總結(jié)
以上是生活随笔為你收集整理的谷歌I/O走进TensorFlow开源模型世界:从图像识别到语义理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手教你用 TensorFlow 实现
- 下一篇: 美团点评业务风控系统构建经验