TensorFlow是谷歌研發(fā)的開源框架。本講座介紹了如何使用TensorFlow創(chuàng)建深度學(xué)習(xí)應(yīng)用程序,以及與其他Python機(jī)器學(xué)習(xí)庫進(jìn)行比較。 CDA字幕組對(duì)該視頻進(jìn)行了漢化,附有中文字幕的視頻如下: 使用TensorFlow和Python進(jìn)行深度學(xué)習(xí)(一)使用TensorFlow和Python進(jìn)行深度學(xué)習(xí)(二)針對(duì)不方面開視頻的小伙伴,CDA字幕組也貼心的整理了文字版本,如下: (文末有彩蛋! ) 我叫Ian Lewis,我是谷歌云平臺(tái)團(tuán)隊(duì)的開發(fā)者大使(Developer Advocate)。來自日本東京,我在東京居住了大約10年。如果你們有任何問題,可以關(guān)注一下我的Twitter賬號(hào) @IanMLewis。 下面我將說明一下PyCon JP(PyCon大會(huì):Python語言社群全球性的盛會(huì))。PyCon JP是日本的PyCon大會(huì)。我們從2011年就開始做PyCon JP,有意思的是PyCon JP實(shí)際上始于2010年的PyCon新加坡。當(dāng)時(shí)我和PyCon JP其他的創(chuàng)始人相遇在這個(gè)會(huì)議。之后我們聚在一起,覺得在日本也需要類似的會(huì)議,所以就有了PyCon JP。一開始還是一個(gè)小型的PyCon,六個(gè)月后在2011年我們做了一場真正像樣的PyCon。所以如果你有興趣的話,可以在PyCon JP注冊報(bào)名,和我們一起交流。 關(guān)于機(jī)器學(xué)習(xí) 介紹一下今天的主題,深度學(xué)習(xí)。我將會(huì)介紹一下深度學(xué)習(xí)的背景,談一談深度學(xué)習(xí)是什么。你們當(dāng)中有多少人了解機(jī)器學(xué)習(xí)科學(xué)家,以及數(shù)據(jù)科學(xué)家?好的,很多人都知道。如果不了解的話,可能會(huì)覺得這個(gè)講座有點(diǎn)無聊。希望在我講TensorFlow時(shí),你們能夠有所收獲。 深度學(xué)習(xí)是特定的一種機(jī)器學(xué)習(xí),特定的神經(jīng)網(wǎng)絡(luò)。當(dāng)中的深度部分來自深度神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)指的是取輸入到網(wǎng)絡(luò)中,輸入連接到節(jié)點(diǎn),當(dāng)中包括激活函數(shù)。這些將用于輸入,之后輸入被導(dǎo)出,作為神經(jīng)網(wǎng)絡(luò)的輸出。 我們用一張貓的圖片當(dāng)例子。輸入就是圖片的像素,經(jīng)過神經(jīng)網(wǎng)絡(luò)得到輸出。比如分類,告訴我們這是貓還是狗等等。這些相互連接并傳遞內(nèi)容的被稱為張量(tensor)。 這里介紹一下背景,這些神經(jīng)網(wǎng)絡(luò)擅長什么? 神經(jīng)網(wǎng)絡(luò)擅長兩類主要問題,一種是分類問題。比如這是我的輸入屬于哪個(gè)類別。這張照片是狗還是貓還是人類等等,因此它擅長添加標(biāo)簽或者分類等等。另一種是回歸,回歸是構(gòu)建數(shù)學(xué)函數(shù) 描述你手里的數(shù)據(jù)。所以你得到很多類型的輸出。 比起回歸,我將多講講分類問題。想象你們有一些分類問題,假設(shè)你有一些數(shù)據(jù)。比如圖中的藍(lán)色和橘色的數(shù)據(jù)??梢哉J(rèn)為這些是人的身高比上體重,藍(lán)色和橘色的點(diǎn)分別是成人和小孩的分組。你想構(gòu)建網(wǎng)絡(luò)或程序,能夠通過人的身高體重來判斷是成人還是孩子。這是一個(gè)很容易解決的問題,你可以在兩者之間畫一條線就行了。 但是這是例子可以通過神經(jīng)網(wǎng)絡(luò)解決。假設(shè)你有更復(fù)雜的問題比如像這個(gè),輸入數(shù)據(jù)不夠清晰。那你該使用哪種函數(shù)或者分類方法區(qū)分這些數(shù)據(jù)。在這個(gè)例子里如果你有一個(gè)非常簡單的神經(jīng)網(wǎng)絡(luò),沒有辦法收斂(converge)。無法解決區(qū)分這兩類數(shù)據(jù)的問題。所以為了解決這個(gè)問題,你需要開發(fā)一個(gè)更復(fù)雜的神經(jīng)網(wǎng)絡(luò) 深度更深。你可以添加中間這些隱藏層,可以讓你利用神經(jīng)網(wǎng)絡(luò)進(jìn)行更復(fù)雜的識(shí)別和分類。根據(jù)我怎么構(gòu)建,這個(gè)可能收斂或者不能。但為了解決這類問題,需要一個(gè)更復(fù)雜的神經(jīng)網(wǎng)絡(luò)。 那么神經(jīng)網(wǎng)絡(luò)的核心有什么?核心是一個(gè)大型函數(shù),輸入一個(gè)張量,輸出另一個(gè)張量。中間步驟在張量進(jìn)行操作,從而生成輸出。這類問題就相當(dāng)于,就像有多少人了解矩陣乘法,這個(gè)是高中數(shù)學(xué)知識(shí)。你會(huì)對(duì)這些張量進(jìn)行這類操作,通過乘以權(quán)重和添加偏差等等。就像流水線一樣,為了得到輸出一遍一遍地重復(fù)。但進(jìn)行乘法要用到的中間權(quán)重。實(shí)際上構(gòu)成了你的神經(jīng)網(wǎng)絡(luò)。 介紹下TensorFlow名字的由來。TensorFlow指張量(tensor)如何流過(flow)神經(jīng)網(wǎng)絡(luò)。 但是張量是什么?你們都很熟悉矩陣乘法或矩陣,比如向量或者簡單的數(shù)組。你將如何把它在編程語言中執(zhí)行。因此你有許多值組成的數(shù)組。矩陣可能是向量的二維或三維版本,你可能在編程語言中有類似這樣的三維矩陣。 張量實(shí)質(zhì)上是任意類型的矩陣,所以它是任意維數(shù)的。因此你有由任意數(shù)量組成的數(shù)組在你的應(yīng)用中作為數(shù)組執(zhí)行,這就是張量。只要維數(shù)匹配,你就可以在張量上進(jìn)行矩陣乘法。當(dāng)實(shí)際執(zhí)行時(shí),神經(jīng)網(wǎng)絡(luò)時(shí)完全連接的。在輸出張量上,每個(gè)輸入值連接輸出值。這意味著,每個(gè)連接都有相應(yīng)的權(quán)重。你所做的就是進(jìn)行加法或乘法。把輸入帶入神經(jīng)網(wǎng)絡(luò),后面加上一些偏差。 這個(gè)例子很簡單。加上偏差,得到輸出向量。比如這里有三個(gè)輸出值,分別代表三個(gè)不同類別。比如對(duì)于輸入圖像,分為貓 、狗 、人。輸出則是百分比或者輸出值。顯示輸入圖像與特定分類的匹配度。這個(gè)特定值的數(shù)值不會(huì)太友好,它只是一個(gè)數(shù)字,代表一個(gè)特定的值。反映你手上的圖片多大程度上是人 狗,還是貓。 對(duì)這類神經(jīng)網(wǎng)絡(luò),最后你通常會(huì)需要增加softmax函數(shù)。softmax的作用是選出最大值,或者對(duì)所有數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化。從而得到的輸出值在0到1之間。給出一個(gè)百分比,說明圖像是貓、狗還是人。假設(shè)得出一張我的圖片是人的可能性為85%,似乎有點(diǎn)低。但你能懂當(dāng)中的意思。 人工神經(jīng)網(wǎng)絡(luò)很厲害的一點(diǎn)是,一開始你不需要太了解數(shù)據(jù)。你可以開始用數(shù)據(jù)訓(xùn)練模型,然后使用反向傳播來繼續(xù)訓(xùn)練模型。更新權(quán)重和偏差,從而提高模型的性能。這正是由我剛才提到的反向傳播來完成的,只需為神經(jīng)網(wǎng)絡(luò)提供損失函數(shù)(loss function)或者代價(jià)函數(shù)(cost function)。計(jì)算期望值和神經(jīng)網(wǎng)絡(luò)的實(shí)際值之間的差值。 我的圖片應(yīng)該是人,那么期望值應(yīng)該是百分之百,表示這個(gè)圖片上是人。而人工神經(jīng)網(wǎng)絡(luò)可能得出圖片是人的概率為85%,使用代價(jià)函數(shù)得到15%的差值。用這個(gè)值更新神經(jīng)網(wǎng)絡(luò)的權(quán)重和偏差,盡可能讓實(shí)際值接近期望值。反復(fù)迭代,該過程最終會(huì)得出最優(yōu)的權(quán)重和偏差。整個(gè)過程需要使用一些輸入數(shù)據(jù)。比如這是一張圖片,這是對(duì)應(yīng)的標(biāo)簽,或者模型應(yīng)該得到的正確輸出值。以上是關(guān)于神經(jīng)網(wǎng)絡(luò)的一些背景知識(shí)。 我花了一半時(shí)間為大家介紹這些內(nèi)容。為什么要講這些內(nèi)容?無外乎是機(jī)器學(xué)習(xí)領(lǐng)域取得的眾多突破性進(jìn)展。 接下來的問題是如何訓(xùn)練模型,如何確定哪些值是預(yù)期得到的。因此你需要一些已經(jīng)匹配的訓(xùn)練數(shù)據(jù),期望值和數(shù)據(jù)相匹配。 我們?yōu)槭裁匆懻摍C(jī)器學(xué)習(xí)? 機(jī)器學(xué)習(xí)為什么成了最近的熱詞? 因?yàn)闄C(jī)器學(xué)習(xí)領(lǐng)域出現(xiàn)了眾多的突破性進(jìn)展,讓我們能利用它解決實(shí)際問題。直到最近,我們能夠用機(jī)器學(xué)習(xí)解決一些特定領(lǐng)域的問題,以輔助我們?nèi)祟愅瓿梢恍┦虑?。然而我們很難把它做成產(chǎn)品,讓它變得容易上手、便于使用。 這是我們在谷歌使用的Inception模型,用于訓(xùn)練圖像以及給圖像匹配標(biāo)簽。接下來我詳細(xì)介紹一下它的背景。 這是深度神經(jīng)網(wǎng)絡(luò)。我之前提到的神經(jīng)網(wǎng)絡(luò)具有矩陣乘法,但類似這樣的深度神經(jīng)網(wǎng)絡(luò),加上'深度(deep)'的關(guān)鍵字或者深度方面。設(shè)想每個(gè)網(wǎng)絡(luò),采用諸如此類的矩陣乘法對(duì)輸入數(shù)據(jù)進(jìn)行操作。 比如輸入是一張1M大小的圖片,設(shè)想其中每個(gè)都有一個(gè)轉(zhuǎn)換為張量的圖片。一張1M大小的圖片可能包含成千上萬個(gè)像素點(diǎn)。它們構(gòu)成張量中數(shù)以千計(jì)的維度。接下來你需要反復(fù)迭代,即對(duì)張量值進(jìn)行數(shù)千次乘法運(yùn)算。不斷迭代,整個(gè)運(yùn)行一遍。能夠想象這是一個(gè)龐大的組合問題。為了訓(xùn)練模型需要完成多少計(jì)算,假設(shè)一張圖片跑一次,而你現(xiàn)在有數(shù)以百萬計(jì)的訓(xùn)練圖像。你需要對(duì)這些圖片進(jìn)行訓(xùn)練,需要成千上萬甚至上百萬次,不難想象這是一個(gè)超大規(guī)模的問題。 我們研究發(fā)現(xiàn)對(duì)這類深度神經(jīng)網(wǎng)絡(luò)而言,結(jié)構(gòu)越復(fù)雜,層數(shù)越多,模型預(yù)測性能越好。因此對(duì)于大量的輸入,如果采用一個(gè)大型的深度神經(jīng)網(wǎng)絡(luò),那么同樣的訓(xùn)練集可以獲得更多的值。但問題是深度神經(jīng)網(wǎng)絡(luò)需要大量的計(jì)算。為此人們通常構(gòu)建大型的矩陣,或者有大量GPU的機(jī)器用來訓(xùn)練模型。通常需要數(shù)小時(shí)數(shù)天或數(shù)周來訓(xùn)練一個(gè)模型。僅為了運(yùn)行一個(gè)測試,確保特定的模型或者特定的神經(jīng)網(wǎng)絡(luò)能夠發(fā)揮性能。 研究人員需要反復(fù)操作,只為獲得一個(gè)可用的模型。一些研究人員開始利用超級(jí)計(jì)算機(jī)進(jìn)行訓(xùn)練,目的是加快速度。然而這對(duì)大多數(shù)人是不可能的。你需要提前租用超級(jí)計(jì)算機(jī)。對(duì)于沒有超級(jí)計(jì)算機(jī)來處理這類機(jī)器學(xué)習(xí)模型的人,他們實(shí)際上利用深度神經(jīng)網(wǎng)絡(luò)。 在谷歌,我們擁有大量的計(jì)算機(jī)設(shè)備。雖然我們沒有超級(jí)計(jì)算機(jī),但我們有許多計(jì)算機(jī)。我們另辟蹊徑,但是我們通過在谷歌利用機(jī)器學(xué)習(xí)取得了眾多重大突破。 這些是我們研發(fā)的產(chǎn)品。你如果熟悉谷歌圖片,可以在你的相冊簿批量添加一組圖片,然后通過關(guān)鍵詞搜索你想要的圖片。例如'雕像' '婚禮' 任何關(guān)鍵詞,系統(tǒng)將搜索到與你輸入的關(guān)鍵詞或標(biāo)簽相匹配的圖片。你不需要提前標(biāo)記這些圖片,也不需要教它這些圖片是什么。根據(jù)之前訓(xùn)練過的模型它已經(jīng)知道了。這很擅長開發(fā)產(chǎn)品和現(xiàn)實(shí)中的應(yīng)用。 另外一件我們正在做的是識(shí)別圖片里的文字。我們有很多街景數(shù)據(jù)或街景圖片。我們想要獲得現(xiàn)實(shí)中商鋪的名字等。因此我們需要通過圖片,從圖片中得出文本。從而得到索引,弄清楚這些商鋪的位置。我們在致力于解決這類問題。 你可能聽過AlphaGo,這是一個(gè)運(yùn)用機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的項(xiàng)目。它會(huì)下圍棋,而且聽說下得很不錯(cuò)。 在Google中機(jī)器學(xué)習(xí)的應(yīng)用越來越多。這是最近的現(xiàn)象,可以注意到這張圖里。在2014年之前 Google中應(yīng)用機(jī)器學(xué)習(xí)項(xiàng)目的數(shù)量有著輕微的增長,但是2014年之后就出現(xiàn)了飛速的增長。說明了機(jī)器學(xué)習(xí)近年來發(fā)展有多迅速。 這是谷歌中的一個(gè)項(xiàng)目,稱為谷歌大腦。用于構(gòu)建這類神經(jīng)網(wǎng)絡(luò)。我們的方式是,通過將神經(jīng)網(wǎng)絡(luò)的問題分配到很多機(jī)器上,并同時(shí)在很多機(jī)器上進(jìn)行訓(xùn)練和預(yù)測。這讓我們能夠利用Inception模型,在使用ImageNet時(shí)能夠提升40倍的速度。正如之前展示的圖,ImageNet是非常著名的數(shù)據(jù)集,用于機(jī)器學(xué)習(xí)和訓(xùn)練。同時(shí)我們還用RankBrain對(duì)搜索結(jié)果進(jìn)行排序的機(jī)器學(xué)習(xí)模型。我們用約50到500個(gè)機(jī)器節(jié)點(diǎn),來訓(xùn)練這類模型。 接下來我們來講TensorFlow。TensorFlow是谷歌研發(fā)的庫,用于構(gòu)建這類機(jī)器學(xué)習(xí)模型。TensorFlow是開源的庫,使用Python。同時(shí)是用來構(gòu)建神經(jīng)網(wǎng)絡(luò)的通用機(jī)器學(xué)習(xí)庫。去年11月我們對(duì)它進(jìn)行了開源?,F(xiàn)在已經(jīng)被用于許多機(jī)器學(xué)習(xí)項(xiàng)目。 TensorFlow的名字源于我之前提過的,即讓張量(tensor)在管道中流動(dòng)(flow)。從而有張量的數(shù)據(jù)流通過神經(jīng)網(wǎng)絡(luò)。這個(gè)思路來自于為這些張量繪制的流程圖。它有一些很酷的特征,比如說能夠靈活直觀地構(gòu)建圖像框架,支持線程、隊(duì)列和異步運(yùn)算??梢栽贑PU GPU或任何支持TensorFlow的設(shè)備上運(yùn)行。它會(huì)在圖中進(jìn)行操作 并對(duì)其進(jìn)行分解,分配到許多的CPU和GPU上。 TensorFlow的核心數(shù)據(jù)結(jié)構(gòu)在于圖(graph)。操作就是圖中的節(jié)點(diǎn),值的張量在操作間傳遞。包括其他內(nèi)容比如常量(constants)即在訓(xùn)練時(shí)不改變的量。這些可以在訓(xùn)練時(shí)或者更新模型時(shí)改變,但在單次訓(xùn)練中是不會(huì)改變的。還有占位符(placeholders)和變量(variables)。占位符類似于神經(jīng)網(wǎng)絡(luò)中的輸入,而變量則是在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)不斷更新的。一般來說,有作為神經(jīng)網(wǎng)絡(luò)輸入的占位符,以及變量類似在訓(xùn)練中進(jìn)行更新的權(quán)重或者偏差。會(huì)話(session)則用于封裝運(yùn)行所在的環(huán)境,它的作用類似于把操作映射到設(shè)備上。這張幻燈片是非排他性列表,包括TensorFlow所支持的操作。我們有一些TensorFlow中所支持的操作。 這是在Jupiter notebook上運(yùn)行TensorFlow的例子。我將用非?;A(chǔ)的MNIST例子進(jìn)行講解,MNIST是用于機(jī)器學(xué)習(xí)的經(jīng)典數(shù)據(jù)集,包括許多手寫數(shù)字的圖片。你要做的就是,用這些數(shù)字進(jìn)行光學(xué)字符識(shí)別(OCR)或者字符識(shí)別,從而確定每個(gè)圖片代表什么數(shù)字。 如果是1,那么你希望輸出文本是1?,F(xiàn)在我要加載測試數(shù)據(jù),在訓(xùn)練數(shù)據(jù)集中進(jìn)行測試。訓(xùn)練圖片共有55000張,每張圖片都被表述或映射到張量中,大小為784個(gè)維度,每一張圖片都有784個(gè)像素,即28乘28。 我調(diào)出一張圖,這是訓(xùn)練數(shù)據(jù)集中的第6張圖。實(shí)際輸出是這樣。這是數(shù)字8的圖片,如果看到原始的輸入圖像,輸入圖像中的值都代表圖像中的一個(gè)特定像素。從0到1,代表這個(gè)圖像多暗。如果是0,像素則為白色。如果是1或者接近1,像素則比較暗。 然后看到這里,這些是訓(xùn)練數(shù)據(jù)。這是訓(xùn)練數(shù)據(jù)輸出的形狀。是10維的,大小為10的數(shù)組。輸出為0、1。訓(xùn)練數(shù)據(jù)是0或1,或是任何一個(gè)值。這說明了訓(xùn)練數(shù)據(jù)代表什么。這是輸入圖像的實(shí)際訓(xùn)練標(biāo)簽,這里為8。在第8個(gè)位置有個(gè)1,說明這個(gè)圖片為8。我們將用它訓(xùn)練神經(jīng)網(wǎng)絡(luò)。 這是我之前展示的圖片。就像你訓(xùn)練神經(jīng)網(wǎng)絡(luò)一樣會(huì)看到每個(gè)像素,并為特定像素分配一個(gè)權(quán)重。因?yàn)槲覍?huì)做一個(gè)相當(dāng)淺的神經(jīng)網(wǎng)絡(luò),只有一個(gè)隱藏層。這會(huì)要給每個(gè)像素分配權(quán)重,表示這個(gè)像素或者圖片是否代表特定數(shù)字。這里的藍(lán)色表示正權(quán)重值(positive weight),紅色表示負(fù)權(quán)重值(negative weight)。所以藍(lán)色區(qū)域的像素表示為0。1、2也是同理。具體看到這個(gè),這個(gè)類似實(shí)際數(shù)字的權(quán)重。你可以看到,這里的8看起來很像8。 一旦完成這一步,你可以設(shè)置神經(jīng)網(wǎng)絡(luò)。要如何實(shí)際訓(xùn)練它。這實(shí)際定義神經(jīng)網(wǎng)絡(luò)。我創(chuàng)建了X作為占位符,這是神經(jīng)網(wǎng)絡(luò)的輸入。所以X是輸入,形狀為784維度。這意味著大小不一定為55000,它可以是任意大小。接著分配這些變量,因此權(quán)重和偏差將在訓(xùn)練中更新。 然后我要定義在值上進(jìn)行的操作。這里要進(jìn)行矩陣乘法,這是我要進(jìn)行的預(yù)定義操作之一。用X乘以W 并且乘以所有的權(quán)重,即進(jìn)行這個(gè)矩陣乘法。最后加上B,加上偏差。接著在上面運(yùn)行softmax。這能夠讓我在神經(jīng)網(wǎng)絡(luò)中進(jìn)行訓(xùn)練。 現(xiàn)在要定義訓(xùn)練步驟,這定義了我將在神經(jīng)網(wǎng)絡(luò)上進(jìn)行的反向傳播。在這里我定義一個(gè)占位符,這是為了損失函數(shù)。在這個(gè)例子中我將用到交叉熵(cross-entropy)。這是損失函數(shù)的一種,你可以嘗試其他幾個(gè)。但這是一個(gè)非常簡單的例子。 我將使用梯度下降優(yōu)化器,這是用來更新權(quán)重和偏差的方法。當(dāng)出現(xiàn)差異時(shí)你可以使用梯度下降,從而明確該如何更新權(quán)重和偏見,應(yīng)該更新多少。你將使用這個(gè)優(yōu)化器,嘗試找出輸出的差異,然后映射到需要更新的權(quán)重和偏差的差異上。這將告訴我如何將交叉熵函數(shù)最小化,進(jìn)行可視化后是這樣。有初始值,接著使用梯度下降優(yōu)化器。從而明確該如何改變這些值,以獲得更好的輸出。為了得到更好的值需要反復(fù)重復(fù)該過程。這里存在找到本地最小值的問題,這是調(diào)整值的不錯(cuò)方式。 接下來我將在神經(jīng)網(wǎng)絡(luò)中,使用優(yōu)化器或者反向傳播從而進(jìn)行訓(xùn)練。這將對(duì)會(huì)話進(jìn)行初始化,即對(duì)TensorFlow的訓(xùn)練會(huì)話進(jìn)行初始化。然后它會(huì)循環(huán),對(duì)數(shù)據(jù)進(jìn)行數(shù)千次的小批量處理。我將取訓(xùn)練集,選出100個(gè)值。有意思的是,我不必對(duì)整個(gè)55000張圖像的訓(xùn)練集進(jìn)行循環(huán),也不必每次訓(xùn)練。我可以隨機(jī)選取一百個(gè)值,并且僅在每個(gè)小批次中進(jìn)行訓(xùn)練。 這很有意思,如果你喜歡統(tǒng)計(jì)你在做的是選出整個(gè)訓(xùn)練集,然后選出當(dāng)中的隨機(jī)樣本進(jìn)行訓(xùn)練,這將得到訓(xùn)練集的代表性樣本。從統(tǒng)計(jì)上來說,最終得到的結(jié)果近似于對(duì)整個(gè)訓(xùn)練集進(jìn)行訓(xùn)練。這類似于你想知道比起其他總統(tǒng)候選人,人們是否喜歡這個(gè)候選人。你不需要問每一個(gè)美國人或者每個(gè)州的人。你可以對(duì)隨機(jī)人群進(jìn)行詢問,得到的結(jié)果與實(shí)際結(jié)果很相近。這樣可以節(jié)省很多的時(shí)間,只需運(yùn)行實(shí)際數(shù)據(jù)的百分之五,從而節(jié)省大量時(shí)間。 接下來可以對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行測試,看其效果如何。這是在TensorFlow中使用的另一種操作,使用argmax函數(shù)。這個(gè)Y值是從神經(jīng)網(wǎng)絡(luò)得出的值,這個(gè)質(zhì)數(shù)Y是訓(xùn)練集中得出的實(shí)際值,是正確的值。我將對(duì)兩者都運(yùn)行argmax函數(shù),這將在輸出的每個(gè)向量中得出0或者1。最后得出我的神經(jīng)網(wǎng)絡(luò)正確率為91%,這實(shí)際上很糟糕。十個(gè)圖像中有一個(gè)是不正確的,但這是一個(gè)非常簡單的例子。 你可以開始做更復(fù)雜的例子 使用MNIST,MNIST當(dāng)中最好的正確率可以達(dá)到99.997%。如果用神經(jīng)網(wǎng)絡(luò)做的更多,可以得到更正確的數(shù)值。 TensorFlow的官網(wǎng)也是很不錯(cuò)的,當(dāng)中有很多教程。比如這個(gè)針對(duì)初學(xué)者的MNIST例子,關(guān)于在TensorFlow上使用MNIST訓(xùn)練集。如果想通過更復(fù)雜的操作得到更好的結(jié)果,可以試試下一個(gè)教程,針對(duì)專家的MNIST教程。給原來的神經(jīng)網(wǎng)絡(luò)增加了些復(fù)雜性,從而提高5%或6%的正確率。還有一些其他教程,比如使用卷積神經(jīng)網(wǎng)絡(luò) 遞歸神經(jīng)網(wǎng)絡(luò)等等。有很多例子,都是簡單易懂的。這讓TensorFlow成為機(jī)器學(xué)習(xí)中非常出色的庫。 在這里出于趣味性,我使用MNIST和Theano庫,運(yùn)行了相同的訓(xùn)練數(shù)據(jù)。Theano庫與TensorFlow的方式很類似,使用方法也類似。在這里我會(huì)使用TensorFlow例子中,這里你所做的非常類似。在Theano中存在共享對(duì)象(shared object),這會(huì)用于權(quán)重和偏差,而不是用變量。接著你可以對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行定義,使用相同的softmax 再加上偏差。然后對(duì)損失函數(shù)和訓(xùn)練步驟定義相同的交叉熵。有點(diǎn)不同的是需要進(jìn)行反向傳播。這里是反向傳播,這是梯度下降函數(shù)??梢越o出代價(jià)函數(shù)的交叉熵,以及權(quán)重和偏差。但需要自己進(jìn)行更新。 之后就可以用Theano建立訓(xùn)練模型,然后做數(shù)千次批次訓(xùn)練 。接著測試,在這里我得到89%正確率。會(huì)得到相同的正確率,因?yàn)椴僮黝愋褪窍嗤?。Theano和TensorFlow的區(qū)別在于庫核心部分的構(gòu)成。 TensorFlow能夠讓你更容易分解操作,并且映射到特定的設(shè)備中。然而 Theano是核心庫,這讓它很難或幾乎不可能映射到多個(gè)GPU或多個(gè)設(shè)備進(jìn)行訓(xùn)練。 TensorFlow的與眾不同在于分布式訓(xùn)練,這能夠?qū)Ω鱾€(gè)GPU和CUP進(jìn)行映射。并且支持許多不同類型的分布式訓(xùn)練。比如數(shù)據(jù)并行(data parallelism),以及模型并行(model parallelism)等等。數(shù)據(jù)并行和模型并行中存在一些取舍,兩者得到的結(jié)果不同。模型并行會(huì)分解模型的不同部分,然后在不同設(shè)備不同機(jī)器上訓(xùn)練相同的數(shù)據(jù)。數(shù)據(jù)并行則是在多臺(tái)機(jī)器上運(yùn)行相同的模型,并拆分?jǐn)?shù)據(jù)。兩者都有不同的優(yōu)缺點(diǎn)。 在谷歌,我們傾向于使用數(shù)據(jù)并行。但是模型并行性適用于許多不同類型的任務(wù)。TensorFlow兩者都支持。我不會(huì)介紹過多的細(xì)節(jié),比如數(shù)據(jù)并行、同步模型、異步模型。如果你感興趣的話,可以之后和我聊聊。 當(dāng)你對(duì)這類機(jī)器學(xué)習(xí)模型或訓(xùn)練進(jìn)行分配時(shí),會(huì)存在一些問題。你需要在各個(gè)機(jī)器之間傳輸大量的數(shù)據(jù),取決于如何分解或分配訓(xùn)練。因此你需要一個(gè)快速的神經(jīng)網(wǎng)絡(luò),因?yàn)椴僮髟趩蝹€(gè)GPU上需要花費(fèi)幾納秒,但是通過網(wǎng)絡(luò)傳輸數(shù)據(jù)需要幾毫秒。分布數(shù)據(jù)的能力上存在數(shù)量級(jí)的差異。問題的瓶頸在于機(jī)器之間的網(wǎng)絡(luò)。 在谷歌我們致力于這類問題。為了使機(jī)器間的連接盡可能快,因此我們計(jì)劃建立一個(gè)云版本,稱為Cloud ML。支持在谷歌數(shù)據(jù)中心運(yùn)行TensorFlow,能夠充分利用谷歌數(shù)據(jù)中心的硬件,從而進(jìn)行分布式訓(xùn)練。這可以幫助你減少時(shí)間。原來需要8小時(shí)如今在20個(gè)節(jié)點(diǎn)上只需32分鐘,快了近15倍。 除了能夠利用GPU以及這類硬件,我們也在開發(fā)自己的硬件用于機(jī)器學(xué)習(xí)和矩陣乘法。這稱為Tensor Processing Unit(TPU)。這是我們在谷歌開發(fā)的一種ASIC,為了獲得更好的性能。GPU是非常耗能的,所以我們開發(fā)了一些耗電少的產(chǎn)品。但是這些是專門針對(duì)機(jī)器學(xué)習(xí)的。我們也計(jì)劃把這些作為云計(jì)算學(xué)習(xí)的一部分。 如果你們對(duì)TensorFlow感興趣,可以看看這些網(wǎng)站。上面有很多例子和教程。這也是TensorFlow很不錯(cuò)的地方。這些教程真的很棒,編寫的很好,簡單易懂。 還可以看看bit.ly/tensorflow-workshop,很適合構(gòu)建TensorFlow模型。包括基礎(chǔ)和進(jìn)階的MNITS例子,還包括如何使用kubernetes,以及使用TensorFlow Serving,構(gòu)建機(jī)器學(xué)習(xí)的產(chǎn)品版本。如果你感興趣的話 一定要看看,謝謝大家來聽講座。 CDA數(shù)據(jù)分析師旗下的CDA字幕組開始招募啦! 我們發(fā)掘了一批優(yōu)質(zhì)的數(shù)據(jù)分析視頻,只要你有責(zé)任心有時(shí)間,有一定的英文翻譯、聽譯能力,最重要的是熱愛數(shù)據(jù)分析,那么就來加入我們吧! 申請(qǐng)報(bào)名:
|