Tensorflow(1)

? ? ? ? Tensorflow是谷歌公司在2015年9月開源的一個(gè)深度學(xué)習(xí)框架,?是一個(gè)采用數(shù)據(jù)流圖用于數(shù)值計(jì)算的開源軟件庫。節(jié)點(diǎn)(Nodes)在圖中表示數(shù)學(xué)操作,圖中的線(edges)則表示在節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(tensor)。它靈活的架構(gòu)讓你可以在多種平臺上展開計(jì)算,例如臺式計(jì)算機(jī)中的一個(gè)或多個(gè)CPU(或GPU),服務(wù)器,移動設(shè)備等等。TensorFlow 最初由Google大腦小組(隸屬于Google機(jī)器智能研究機(jī)構(gòu))的研究員和工程師們開發(fā)出來,用于機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)方面的研究,但這個(gè)系統(tǒng)的通用性使其也可廣泛用于其他計(jì)算領(lǐng)域。

什么是數(shù)據(jù)流圖(Data Flow Graph)?

? ? ? ? 數(shù)據(jù)流圖用“結(jié)點(diǎn)”(nodes)和“線”(edges)的有向圖來描述數(shù)學(xué)計(jì)算?!肮?jié)點(diǎn)” 一般用來表示施加的數(shù)學(xué)操作,但也可以表示數(shù)據(jù)輸入(feed in)的起點(diǎn)/輸出(push out)的終點(diǎn),或者是讀取/寫入持久變量(persistent variable)的終點(diǎn)?!熬€”表示“節(jié)點(diǎn)”之間的輸入/輸出關(guān)系。這些數(shù)據(jù)“線”可以輸運(yùn)“size可動態(tài)調(diào)整”的多維數(shù)據(jù)數(shù)組,即“張量”(tensor)。張量從圖中流過的直觀圖像是這個(gè)工具取名為“Tensorflow”的原因。一旦輸入端的所有張量準(zhǔn)備好,節(jié)點(diǎn)將被分配到各種計(jì)算設(shè)備完成異步并行地執(zhí)行運(yùn)算。



TensorFlow的特征

高度的靈活性

TensorFlow 不是一個(gè)嚴(yán)格的“神經(jīng)網(wǎng)絡(luò)”庫。只要你可以將你的計(jì)算表示為一個(gè)數(shù)據(jù)流圖,你就可以使用Tensorflow。你來構(gòu)建圖,描寫驅(qū)動計(jì)算的內(nèi)部循環(huán)。我們提供了有用的工具來幫助你組裝“子圖”(常用于神經(jīng)網(wǎng)絡(luò)),當(dāng)然用戶也可以自己在Tensorflow基礎(chǔ)上寫自己的“上層庫”。定義順手好用的新復(fù)合操作和寫一個(gè)python函數(shù)一樣容易,而且也不用擔(dān)心性能損耗。當(dāng)然萬一你發(fā)現(xiàn)找不到想要的底層數(shù)據(jù)操作,你也可以自己寫一點(diǎn)c++代碼來豐富底層的操作。

真正的可移植性(Portability)

Tensorflow 在CPU和GPU上運(yùn)行,比如說可以運(yùn)行在臺式機(jī)、服務(wù)器、手機(jī)移動設(shè)備等等。想要在沒有特殊硬件的前提下,在你的筆記本上跑一下機(jī)器學(xué)習(xí)的新想法?Tensorflow可以辦到這點(diǎn)。準(zhǔn)備將你的訓(xùn)練模型在多個(gè)CPU上規(guī)?;\(yùn)算,又不想修改代碼?Tensorflow可以辦到這點(diǎn)。想要將你的訓(xùn)練好的模型作為產(chǎn)品的一部分用到手機(jī)app里?Tensorflow可以辦到這點(diǎn)。你改變主意了,想要將你的模型作為云端服務(wù)運(yùn)行在自己的服務(wù)器上,或者運(yùn)行在Docker容器里?Tensorfow也能辦到。Tensorflow就是這么拽 :)

將科研和產(chǎn)品聯(lián)系在一起

過去如果要將科研中的機(jī)器學(xué)習(xí)想法用到產(chǎn)品中,需要大量的代碼重寫工作。那樣的日子一去不復(fù)返了!在Google,科學(xué)家用Tensorflow嘗試新的算法,產(chǎn)品團(tuán)隊(duì)則用Tensorflow來訓(xùn)練和使用計(jì)算模型,并直接提供給在線用戶。使用Tensorflow可以讓應(yīng)用型研究者將想法迅速運(yùn)用到產(chǎn)品中,也可以讓學(xué)術(shù)性研究者更直接地彼此分享代碼,從而提高科研產(chǎn)出率。

自動求微分

基于梯度的機(jī)器學(xué)習(xí)算法會受益于Tensorflow自動求微分的能力。作為Tensorflow用戶,你只需要定義預(yù)測模型的結(jié)構(gòu),將這個(gè)結(jié)構(gòu)和目標(biāo)函數(shù)(objective function)結(jié)合在一起,并添加數(shù)據(jù),Tensorflow將自動為你計(jì)算相關(guān)的微分導(dǎo)數(shù)。計(jì)算某個(gè)變量相對于其他變量的導(dǎo)數(shù)僅僅是通過擴(kuò)展你的圖來完成的,所以你能一直清楚看到究竟在發(fā)生什么。

多語言支持

Tensorflow 有一個(gè)合理的c++使用界面,也有一個(gè)易用的python使用界面來構(gòu)建和執(zhí)行你的graphs。你可以直接寫python/c++程序,也可以用交互式的ipython界面來用Tensorflow嘗試些想法,它可以幫你將筆記、代碼、可視化等有條理地歸置好。當(dāng)然這僅僅是個(gè)起點(diǎn)——我們希望能鼓勵(lì)你創(chuàng)造自己最喜歡的語言界面,比如Go,Java,Lua,Javascript,或者是R。

性能最優(yōu)化

比如說你又一個(gè)32個(gè)CPU內(nèi)核、4個(gè)GPU顯卡的工作站,想要將你工作站的計(jì)算潛能全發(fā)揮出來?由于Tensorflow 給予了線程、隊(duì)列、異步操作等以最佳的支持,Tensorflow 讓你可以將你手邊硬件的計(jì)算潛能全部發(fā)揮出來。你可以自由地將Tensorflow圖中的計(jì)算元素分配到不同設(shè)備上,Tensorflow可以幫你管理好這些不同副本。

誰可以用 TensorFlow?

任何人都可以用Tensorflow。學(xué)生、研究員、愛好者、極客、工程師、開發(fā)者、發(fā)明家、創(chuàng)業(yè)者等等都可以在Apache 2.0開源協(xié)議下使用Tensorflow。

Tensorflow 還沒竣工,它需要被進(jìn)一步擴(kuò)展和上層建構(gòu)。我們剛發(fā)布了源代碼的最初版本,并且將持續(xù)完善它。我們希望大家通過直接向源代碼貢獻(xiàn),或者提供反饋,來建立一個(gè)活躍的開源社區(qū),以推動這個(gè)代碼庫的未來發(fā)展。

為啥Google要開源這個(gè)神器?

如果Tensorflow這么好,為啥不藏起來而是要開源呢?答案或許比你想象的簡單:我們認(rèn)為機(jī)器學(xué)習(xí)是未來新產(chǎn)品和新技術(shù)的一個(gè)關(guān)鍵部分。在這一個(gè)領(lǐng)域的研究是全球性的,并且發(fā)展很快,卻缺少一個(gè)標(biāo)準(zhǔn)化的工具。通過分享這個(gè)我們認(rèn)為是世界上最好的機(jī)器學(xué)習(xí)工具庫之一的東東,我們希望能夠創(chuàng)造一個(gè)開放的標(biāo)準(zhǔn),來促進(jìn)交流研究想法和將機(jī)器學(xué)習(xí)算法產(chǎn)品化。Google的工程師們確實(shí)在用它來提供用戶直接在用的產(chǎn)品和服務(wù),而Google的研究團(tuán)隊(duì)也將在他們的許多科研文章中分享他們對Tensorflow的使用。

TensorflowSharp中的概念

TensorflowSharp / Tensorflow中最重要的幾個(gè)概念:

圖(Graph):它包含了一個(gè)計(jì)算任務(wù)中的所有變量和計(jì)算方式。可以將它和C#中的表達(dá)式樹進(jìn)行類比。例如,一個(gè)1+2可以被看作為兩個(gè)常量表達(dá)式,以一個(gè)二元運(yùn)算表達(dá)式連接起來。在Tensorflow的世界中,則可以看成是兩個(gè)tensor和一個(gè)op(operation的縮寫,即操作)。簡單來說,做一個(gè)機(jī)器學(xué)習(xí)的任務(wù)就是計(jì)算一張圖。

在計(jì)算圖之前,當(dāng)然要把圖建立好。例如,計(jì)算(1+2)*3再開根號,是一個(gè)包括了3個(gè)tensor和3個(gè)Op的圖。

不過,Tensorflow的圖和常規(guī)的表達(dá)式還有所不同,Tensorflow中的節(jié)點(diǎn)變量是可以被遞歸的更新的。我們所說的“訓(xùn)練”,也就是不停的計(jì)算一個(gè)圖,獲得圖的計(jì)算結(jié)果,再根據(jù)結(jié)果的值調(diào)整節(jié)點(diǎn)變量的值,然后根據(jù)新的變量的值再重新計(jì)算圖,如此重復(fù),直到結(jié)果令人滿意(小于某個(gè)閾值),或跑到了一個(gè)無窮大/?。ㄟ@說明圖的變量初始值設(shè)置的有問題),或者結(jié)果基本不變了為止。

前面說過,從內(nèi)部機(jī)制上來說,TF就是建立數(shù)據(jù)流圖來進(jìn)行數(shù)值計(jì)算。所以,當(dāng)你使用TF來搭建模型時(shí),其實(shí)主要涉及兩個(gè)方面:根據(jù)模型建立計(jì)算圖,然后送入數(shù)據(jù)運(yùn)行計(jì)算圖得到結(jié)果。計(jì)算圖computational graph是TF中很重要的一個(gè)概念,其是由一系列節(jié)點(diǎn)(nodes)組成的圖模型,每個(gè)節(jié)點(diǎn)對應(yīng)的是TF的一個(gè)算子(operation)。每個(gè)算子會有輸入與輸出,并且輸入和輸出都是張量。所以我們使用TF的算子可以構(gòu)建自己的深度學(xué)習(xí)模型,其背后的就是一個(gè)計(jì)算圖。還有一點(diǎn)這個(gè)計(jì)算圖是靜態(tài)的,意思是這個(gè)計(jì)算圖每個(gè)節(jié)點(diǎn)接收什么樣的張量和輸出什么樣的張量已經(jīng)固定下來。要運(yùn)行這個(gè)計(jì)算圖,你需要開啟一個(gè)會話(session),在session中這個(gè)計(jì)算圖才可以真正運(yùn)行。

會話(Session):為了獲得圖的計(jì)算結(jié)果,圖必須在會話中被啟動。圖是會話類型的一個(gè)成員,會話類型還包括一個(gè)runner,負(fù)責(zé)執(zhí)行這張圖。會話的主要任務(wù)是在圖運(yùn)算時(shí)分配CPU或GPU。

張量(tensor): Tensorflow中所有的輸入輸出變量都是張量,而不是基本的int,double這樣的類型,即使是一個(gè)整數(shù)1,也必須被包裝成一個(gè)0維的,長度為1的張量【1】。一個(gè)張量和一個(gè)矩陣差不多,可以被看成是一個(gè)多維的數(shù)組,從最基本的一維到N維都可以。張量擁有階(rank),形狀(shape),和數(shù)據(jù)類型。其中,形狀可以被理解為長度,例如,一個(gè)形狀為2的張量就是一個(gè)長度為2的一維數(shù)組。而階可以被理解為維數(shù)。

? ? ? ? 對于任何深度學(xué)習(xí)框架,你都要先了解張量(Tensor)的概念,張量可以看成是向量和矩陣的衍生。向量是一維的,而矩陣是二維的,對于張量其可以是任何維度的。一般情況下,你要懂得張量的兩個(gè)屬性:形狀(shape)和秩(rank)。秩很好理解,就是有多少個(gè)維度;而形狀是指的每個(gè)維度的大小。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 張量的形象圖表示

? ? ? 名字就是TensorFlow,直觀來看,就是張量的流動。張量(tensor),即任意維度的數(shù)據(jù),一維、二維、三維、四維等數(shù)據(jù)統(tǒng)稱為張量。而張量的流動則是指保持計(jì)算節(jié)點(diǎn)不變,讓數(shù)據(jù)進(jìn)行流動。這樣的設(shè)計(jì)是針對連接式的機(jī)器學(xué)習(xí)算法,比如邏輯斯底回歸,神經(jīng)網(wǎng)絡(luò)等。連接式的機(jī)器學(xué)習(xí)算法可以把算法表達(dá)成一張圖,張量從圖中從前到后走一遍就完成了前向運(yùn)算;而殘差從后往前走一遍,就完成了后向傳播。

Tensorflow中的運(yùn)算(op)有很多很多種,最簡單的當(dāng)然就是加減乘除,它們的輸入和輸出都是tensor。

Runner:在建立圖之后,必須使用會話中的Runner來運(yùn)行圖,才能得到結(jié)果。在運(yùn)行圖時(shí),需要為所有的變量和占位符賦值,否則就會報(bào)錯(cuò)。

TensorflowSharp中的幾類主要變量

Const:常量,這很好理解。它們在定義時(shí)就必須被賦值,而且值永遠(yuǎn)無法被改變。

Placeholder:占位符。這是一個(gè)在定義時(shí)不需要賦值,但在使用之前必須賦值(feed)的變量,通常用作訓(xùn)練數(shù)據(jù)。

Variable:變量,它和占位符的不同是它在定義時(shí)需要賦值,而且它的數(shù)值是可以在圖的計(jì)算過程中隨時(shí)改變的。因此,占位符通常用作圖的輸入(即訓(xùn)練數(shù)據(jù)),而變量用作圖中可以被“訓(xùn)練”或“學(xué)習(xí)”的那些tensor,例如y=ax+b中的a和b。

Cloud Machine Learning

? ? ? ?前面已經(jīng)介紹了TensorFlow相關(guān)的全部內(nèi)容,細(xì)心的網(wǎng)友可能已經(jīng)發(fā)現(xiàn),TensorFlow功能強(qiáng)大,但究其本質(zhì)還是一個(gè)library,用戶除了編寫TensorFlow應(yīng)用代碼還需要在物理機(jī)上起服務(wù),并且手動指定訓(xùn)練數(shù)據(jù)和模型文件的目錄,維護(hù)成本比較大,而且機(jī)器之間不可共享。

? ? ? ?縱觀大數(shù)據(jù)處理和資源調(diào)度行業(yè),Hadoop生態(tài)儼然成為了業(yè)界的標(biāo)準(zhǔn),通過MapReduce或Spark接口來處理數(shù)據(jù),用戶通過API提交任務(wù)后由Yarn進(jìn)行統(tǒng)一的資源分配和調(diào)度,不僅讓分布式計(jì)算成為可能,也通過資源共享和統(tǒng)一調(diào)度平的臺極大地提高了服務(wù)器的利用率。很遺憾TensorFlow定義是深度學(xué)習(xí)框架,并不包含集群資源管理等功能,但開源TensorFlow以后,Google很快公布了Google Cloud ML服務(wù),我們從Alpha版本開始已經(jīng)是Cloud ML的早期用戶,深深體會到云端訓(xùn)練深度學(xué)習(xí)的便利性。通過Google Cloud ML服務(wù),我們可以把TensorFlow應(yīng)用代碼直接提交到云端運(yùn)行,甚至可以把訓(xùn)練好的模型直接部署在云上,通過API就可以直接訪問,也得益于TensorFlow良好的設(shè)計(jì),我們基于Kubernetes和TensorFlow serving實(shí)現(xiàn)了Cloud Machine Learning服務(wù),架構(gòu)設(shè)計(jì)和使用接口都與Google Cloud ML類似。


本文整理轉(zhuǎn)載自其它博文,如有侵權(quán),請聯(lián)系364017364@qq.com刪除。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容