成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Tensorflow代碼解析(一)

李世贊 / 3391人閱讀

摘要:本文依據(jù)對(duì)簡(jiǎn)稱白皮書和官方教程的理解,從系統(tǒng)和代碼實(shí)現(xiàn)角度講解的內(nèi)部實(shí)現(xiàn)原理。這一點(diǎn)是和包括在內(nèi)的符號(hào)編程框架較大的不同。的做法是引入了來(lái)處理。這樣就幾乎讓本身成為一門獨(dú)立的語(yǔ)言。當(dāng)為是,執(zhí)行操作當(dāng)為時(shí),執(zhí)行操作。支持的控制算子有和等。

摘要

2015年11月9日,Google發(fā)布深度學(xué)習(xí)框架TensorFlow并宣布開源,并迅速得到廣泛關(guān)注,在圖形分類、音頻處理、推薦系統(tǒng)和自然語(yǔ)言處理等場(chǎng)景下都被大面積推廣。TensorFlow系統(tǒng)更新快速,官方文檔教程齊全,上手快速且簡(jiǎn)單易用,支持Python和C++接口。本文依據(jù)對(duì)Tensorflow(簡(jiǎn)稱TF)白皮書[1]、TF Github[2]和TF官方教程[3]的理解,從系統(tǒng)和代碼實(shí)現(xiàn)角度講解TF的內(nèi)部實(shí)現(xiàn)原理。以Tensorflow r0.8.0為基礎(chǔ),本文由淺入深的闡述Tensor和Flow的概念。先介紹了TensorFlow的核心概念和基本概述,然后剖析了OpKernels模塊、Graph模塊、Session模塊。

1. TF系統(tǒng)架構(gòu)

1.1 TF依賴視圖

TF的依賴視圖如圖 2 1所示[4],描述了TF的上下游關(guān)系鏈。

圖 1 1 TensorFlow依賴視圖

TF托管在github平臺(tái),有g(shù)oogle groups和contributors共同維護(hù)。

TF提供了豐富的深度學(xué)習(xí)相關(guān)的API,支持Python和C/C++接口。

TF提供了可視化分析工具Tensorboard,方便分析和調(diào)整模型。

TF支持Linux平臺(tái),Windows平臺(tái),Mac平臺(tái),甚至手機(jī)移動(dòng)設(shè)備等各種平臺(tái)。

1.2 TF系統(tǒng)架構(gòu)

圖 1 2是TF的系統(tǒng)架構(gòu),從底向上分為設(shè)備管理和通信層、數(shù)據(jù)操作層、圖計(jì)算層、API接口層、應(yīng)用層。其中設(shè)備管理和通信層、數(shù)據(jù)操作層、圖計(jì)算層是TF的核心層。

圖 1 2 TF系統(tǒng)架構(gòu)

底層設(shè)備通信層負(fù)責(zé)網(wǎng)絡(luò)通信和設(shè)備管理。設(shè)備管理可以實(shí)現(xiàn)TF設(shè)備異構(gòu)的特性,支持CPU、GPU、Mobile等不同設(shè)備。網(wǎng)絡(luò)通信依賴gRPC通信協(xié)議實(shí)現(xiàn)不同設(shè)備間的數(shù)據(jù)傳輸和更新。

第二層是Tensor的OpKernels實(shí)現(xiàn)。這些OpKernels以Tensor為處理對(duì)象,依賴網(wǎng)絡(luò)通信和設(shè)備內(nèi)存分配,實(shí)現(xiàn)了各種Tensor操作或計(jì)算。Opkernels不僅包含MatMul等計(jì)算操作,還包含Queue等非計(jì)算操作,這些將在第5章Kernels模塊詳細(xì)介紹。

第三層是圖計(jì)算層(Graph),包含本地計(jì)算流圖和分布式計(jì)算流圖的實(shí)現(xiàn)。Graph模塊包含Graph的創(chuàng)建、編譯、優(yōu)化和執(zhí)行等部分,Graph中每個(gè)節(jié)點(diǎn)都是OpKernels類型表示。關(guān)于圖計(jì)算將在第6章Graph模塊詳細(xì)介紹。

第四層是API接口層。Tensor C API是對(duì)TF功能模塊的接口封裝,便于其他語(yǔ)言平臺(tái)調(diào)用。

第四層以上是應(yīng)用層。不同編程語(yǔ)言在應(yīng)用層通過API接口層調(diào)用TF核心功能實(shí)現(xiàn)相關(guān)實(shí)驗(yàn)和應(yīng)用。

1.3TF代碼目錄組織

圖 1 3是TF的代碼結(jié)構(gòu)視圖,下面將簡(jiǎn)單介紹TF的目錄組織結(jié)構(gòu)。

圖 1 3 TF代碼目錄組織結(jié)構(gòu)

Tensorflow/core目錄包含了TF核心模塊代碼。

? ? ? ? public: API接口頭文件目錄,用于外部接口調(diào)用的API定義,主要是session.h 和tensor_c_api.h。

? ? ? ? client: API接口實(shí)現(xiàn)文件目錄。

? ? ? ? platform: OS系統(tǒng)相關(guān)接口文件,如file system, env等。

? ? ? ? protobuf: 均為.proto文件,用于數(shù)據(jù)傳輸時(shí)的結(jié)構(gòu)序列化.

? ? ? ? common_runtime: 公共運(yùn)行庫(kù),包含session, executor, threadpool, rendezvous, memory管理, 設(shè)備分配算法等。

? ? ? ? distributed_runtime: 分布式執(zhí)行模塊,如rpc session, rpc master, rpc worker, graph manager。

? ? ? ? framework: 包含基礎(chǔ)功能模塊,如log, memory, tensor

? ? ? ? graph: 計(jì)算流圖相關(guān)操作,如construct, partition, optimize, execute等

? ? ? ? kernels: 核心Op,如matmul, conv2d, argmax, batch_norm等

? ? ? ? lib: 公共基礎(chǔ)庫(kù),如gif、gtl(google模板庫(kù))、hash、histogram等。

? ? ? ? ops: 基本ops運(yùn)算,ops梯度運(yùn)算,io相關(guān)的ops,控制流和數(shù)據(jù)流操作

? ? ? ? Tensorflow/stream_executor目錄是并行計(jì)算框架,由google stream executor團(tuán)隊(duì)開發(fā)。

? ? ? ? Tensorflow/contrib目錄是contributor開發(fā)目錄。

? ? ? ? Tensroflow/python目錄是python API客戶端腳本。

? ? ? ?Tensorflow/tensorboard目錄是可視化分析工具,不僅可以模型可視化,還可以監(jiān)控模型參數(shù)變化。

? ? ? ? third_party目錄是TF第三方依賴庫(kù)。

? ? ? ? eigen3: eigen矩陣運(yùn)算庫(kù),TF基礎(chǔ)ops調(diào)用

? ? ? ? gpus: 封裝了cuda/cudnn編程庫(kù)

2. TF核心概念

TF的核心是圍繞Graph展開的,簡(jiǎn)而言之,就是Tensor沿著Graph傳遞閉包完成Flow的過程。所以在介紹Graph之前需要講述一下符號(hào)編程、計(jì)算流圖、梯度計(jì)算、控制流的概念。

2.1 Tensor

在數(shù)學(xué)上,Matrix表示二維線性映射,Tensor表示多維線性映射,Tensor是對(duì)Matrix的泛化,可以表示1-dim、2-dim、N-dim的高維空間。圖 2 1對(duì)比了矩陣乘法(Matrix Product)和張量積(Tensor Contract),可以看出Tensor的泛化能力,其中張量積運(yùn)算在TF的MatMul和Conv2D運(yùn)算中都有用到,

圖 2 1 Tensor contract

Tensor在高維空間數(shù)學(xué)運(yùn)算比Matrix計(jì)算復(fù)雜,計(jì)算量也非常大,加速?gòu)埩坎⑿羞\(yùn)算是TF優(yōu)先考慮的問題,如add, contract, slice, reshape, reduce, shuffle等運(yùn)算。

TF中Tensor的維數(shù)描述為階,數(shù)值是0階,向量是1階,矩陣是2階,以此類推,可以表示n階高維數(shù)據(jù)。

TF中Tensor支持的數(shù)據(jù)類型有很多,如tf.float16, tf.float32, tf.float64, tf.uint8, tf.int8, tf.int16, tf.int32, tf.int64, tf.string, tf.bool, tf.complex64等,所有Tensor運(yùn)算都使用泛化的數(shù)據(jù)類型表示。

TF的Tensor定義和運(yùn)算主要是調(diào)用Eigen矩陣計(jì)算庫(kù)完成的。TF中Tensor的UML定義如圖 2 2。其中TensorBuffer指針指向Eigen::Tensor類型。其中,Eigen::Tensor[5][6]不屬于Eigen官方維護(hù)的程序,由貢獻(xiàn)者提供文檔和維護(hù),所以Tensor定義在Eigen unsupported模塊中。

圖 2 2 Tensor數(shù)據(jù)結(jié)構(gòu)定義

圖 2 2中,Tensor主要包含兩個(gè)變量m_data和m_dimension,m_data保存了Tensor的數(shù)據(jù)塊,T是泛化的數(shù)據(jù)類型,m_dimensions保存了Tensor的維度信息。

Eigen::Tensor的成員變量很簡(jiǎn)單,卻支持非常多的基本運(yùn)算,再借助Eigen的加速機(jī)制實(shí)現(xiàn)快速計(jì)算,參考章節(jié)3.2。Eigen::Tensor主要包含了

? ? ? ?一元運(yùn)算(Unary),如sqrt、square、exp、abs等。

? ? ? ?二元運(yùn)算(Binary),如add,sub,mul,div等

? ? ? ?選擇運(yùn)算(Selection),即if / else條件運(yùn)算

? ? ? ?歸納運(yùn)算(Reduce),如reduce_sum, reduce_mean等

? ? ? ?幾何運(yùn)算(Geometry),如reshape,slice,shuffle,chip,reverse,pad,concatenate,extract_patches,extract_image_patches等

? ? ? ?張量積(Contract)和卷積運(yùn)算(Convolve)是重點(diǎn)運(yùn)算,后續(xù)會(huì)詳細(xì)講解。

2.2 符號(hào)編程

編程模式通常分為命令式編程(imperative style programs)和符號(hào)式編程(symbolic style programs)。

命令式編程容易理解和調(diào)試,命令語(yǔ)句基本沒有優(yōu)化,按原有邏輯執(zhí)行。符號(hào)式編程涉及較多的嵌入和優(yōu)化,不容易理解和調(diào)試,但運(yùn)行速度有同比提升。

這兩種編程模式在實(shí)際中都有應(yīng)用,Torch是典型的命令式風(fēng)格,caffe、theano、mxnet和Tensorflow都使用了符號(hào)式編程。其中caffe、mxnet采用了兩種編程模式混合的方法,而Tensorflow是完全采用了符號(hào)式編程,Theano和Tensorflow的編程模式更相近。

命令式編程是常見的編程模式,編程語(yǔ)言如python/C++都采用命令式編程。命令式編程明確輸入變量,并根據(jù)程序邏輯逐步運(yùn)算,這種模式非常在調(diào)試程序時(shí)進(jìn)行單步跟蹤,分析中間變量。舉例來(lái)說,設(shè)A=10, B=10,計(jì)算邏輯:

第一步計(jì)算得出C=100,第二步計(jì)算得出D=101,輸出結(jié)果D=101。

符號(hào)式編程將計(jì)算過程抽象為計(jì)算圖,計(jì)算流圖可以方便的描述計(jì)算過程,所有輸入節(jié)點(diǎn)、運(yùn)算節(jié)點(diǎn)、輸出節(jié)點(diǎn)均符號(hào)化處理。計(jì)算圖通過建立輸入節(jié)點(diǎn)到輸出節(jié)點(diǎn)的傳遞閉包,從輸入節(jié)點(diǎn)出發(fā),沿著傳遞閉包完成數(shù)值計(jì)算和數(shù)據(jù)流動(dòng),直到達(dá)到輸出節(jié)點(diǎn)。這個(gè)過程經(jīng)過計(jì)算圖優(yōu)化,以數(shù)據(jù)(計(jì)算)流方式完成,節(jié)省內(nèi)存空間使用,計(jì)算速度快,但不適合程序調(diào)試,通常不用于編程語(yǔ)言中。舉上面的例子,先根據(jù)計(jì)算邏輯編寫符號(hào)式程序并生成計(jì)算圖

其中A和B是輸入符號(hào)變量,C和D是運(yùn)算符號(hào)變量,compile函數(shù)生成計(jì)算圖F,如圖 2 3所示。

圖 2 3 符號(hào)編程的正向計(jì)算圖

最后得到A=10, B=10時(shí)變量D的值,這里D可以復(fù)用C的內(nèi)存空間,省去了中間變量的空間存儲(chǔ)。

圖 2 4是TF中的計(jì)算流圖,C=F(Relu(Add(MatMul(W, x), b))),其中每個(gè)節(jié)點(diǎn)都是符號(hào)化表示的。通過session創(chuàng)建graph,在調(diào)用session.run執(zhí)行計(jì)算。

圖 2 4 TF符號(hào)計(jì)算圖

和目前的符號(hào)語(yǔ)言比起來(lái),TF較大的特點(diǎn)是強(qiáng)化了數(shù)據(jù)流圖,引入了mutation的概念。這一點(diǎn)是TF和包括Theano在內(nèi)的符號(hào)編程框架較大的不同。所謂mutation,就是可以在計(jì)算的過程更改一個(gè)變量的值,而這個(gè)變量在計(jì)算的過程中會(huì)被帶入到下一輪迭代里面去。

Mutation是機(jī)器學(xué)習(xí)優(yōu)化算法幾乎必須要引入的東西(雖然也可以通過immutable replacement來(lái)代替,但是會(huì)有效率的問題)。 Theano的做法是引入了update statement來(lái)處理mutation。TF選擇了純符號(hào)計(jì)算的路線,并且直接把更新引入了數(shù)據(jù)流圖中去。從目前的白皮書看還會(huì)支持條件和循環(huán)。這樣就幾乎讓TF本身成為一門獨(dú)立的語(yǔ)言。不過這一點(diǎn)會(huì)導(dǎo)致最后的API設(shè)計(jì)和使用需要特別小心,把mutation 引入到數(shù)據(jù)流圖中會(huì)帶來(lái)一些新的問題,比如如何處理寫與寫之間的依賴。[7]

2.3 梯度計(jì)算

梯度計(jì)算主要應(yīng)用在誤差反向傳播和數(shù)據(jù)更新,是深度學(xué)習(xí)平臺(tái)要解決的核心問題。梯度計(jì)算涉及每個(gè)計(jì)算節(jié)點(diǎn),每個(gè)自定義的前向計(jì)算圖都包含一個(gè)隱式的反向計(jì)算圖。從數(shù)據(jù)流向上看,正向計(jì)算圖是數(shù)據(jù)從輸入節(jié)點(diǎn)到輸出節(jié)點(diǎn)的流向過程,反向計(jì)算圖是數(shù)據(jù)從輸出節(jié)點(diǎn)到輸入節(jié)點(diǎn)的流向過程。

圖 2 5是2.2節(jié)中圖 2 3對(duì)應(yīng)的反向計(jì)算圖。圖中,由于C=A*B,則dA=B*dC, dB=A*dC。在反向計(jì)算圖中,輸入節(jié)點(diǎn)dD,輸出節(jié)點(diǎn)dA和dB,計(jì)算表達(dá)式為dA=B*dC=B*dD, dB=A*dC=A*dD。每一個(gè)正向計(jì)算節(jié)點(diǎn)對(duì)應(yīng)一個(gè)隱式梯度計(jì)算節(jié)點(diǎn)。

圖 2 5 符號(hào)編程的反向計(jì)算圖

反向計(jì)算限制了符號(hào)編程中內(nèi)存空間復(fù)用的優(yōu)勢(shì),因?yàn)樵谡蛴?jì)算中的計(jì)算數(shù)據(jù)在反向計(jì)算中也可能要用到。從這一點(diǎn)上講,粗粒度的計(jì)算節(jié)點(diǎn)比細(xì)粒度的計(jì)算節(jié)點(diǎn)更有優(yōu)勢(shì),而TF大部分為細(xì)粒度操作,雖然靈活性很強(qiáng),但細(xì)粒度操作涉及到更多的優(yōu)化方案,在工程實(shí)現(xiàn)上開銷較大,不及粗粒度簡(jiǎn)單直接。在神經(jīng)網(wǎng)絡(luò)模型中,TF將逐步側(cè)重粗粒度運(yùn)算。

2.4 控制流

TF的計(jì)算圖如同數(shù)據(jù)流一樣,數(shù)據(jù)流向表示計(jì)算過程,如圖 2 6。數(shù)據(jù)流圖可以很好的表達(dá)計(jì)算過程,為了擴(kuò)展TF的表達(dá)能力,TF中引入控制流。

圖 2 6 Graph的數(shù)據(jù)流

在編程語(yǔ)言中,if…else…是最常見的邏輯控制,在TF的數(shù)據(jù)流中也可以通過這種方式控制數(shù)據(jù)流向。接口函數(shù)如下,pred為判別表達(dá)式,fn1和fn2為運(yùn)算表達(dá)式。當(dāng)pred為true是,執(zhí)行fn1操作;當(dāng)pred為false時(shí),執(zhí)行fn2操作。

TF還可以協(xié)調(diào)多個(gè)數(shù)據(jù)流,在存在依賴節(jié)點(diǎn)的場(chǎng)景下非常有用,例如節(jié)點(diǎn)B要讀取模型參數(shù)θ更新后的值,而節(jié)點(diǎn)A負(fù)責(zé)更新參數(shù)θ,則節(jié)點(diǎn)B必須等節(jié)點(diǎn)A完成后才能執(zhí)行,否則讀取的參數(shù)θ為更新前的數(shù)值,這時(shí)需要一個(gè)運(yùn)算控制器。接口函數(shù)如下,tf.control_dependencies函數(shù)可以控制多個(gè)數(shù)據(jù)流執(zhí)行完成后才能執(zhí)行接下來(lái)的操作,通常與tf.group函數(shù)結(jié)合使用。

TF支持的控制算子有Switch、Merge、Enter、Leave和NextIteration等。

TF不僅支持邏輯控制,還支持循環(huán)控制。TF使用和MIT Token-Tagged machine相似的表示系統(tǒng),將循環(huán)的每次迭代標(biāo)記為一個(gè)tag,迭代的執(zhí)行狀態(tài)標(biāo)記為一個(gè)frame,但迭代所需的數(shù)據(jù)準(zhǔn)備好的時(shí)候,就可以開始計(jì)算,從而多個(gè)迭代可以同時(shí)執(zhí)行。

作者簡(jiǎn)介:

姚健,畢業(yè)于中科院計(jì)算所網(wǎng)絡(luò)數(shù)據(jù)實(shí)驗(yàn)室,畢業(yè)后就職于360天眼實(shí)驗(yàn)室,主要從事深度學(xué)習(xí)和增強(qiáng)學(xué)習(xí)相關(guān)研究工作。目前就職于騰訊MIG事業(yè)部,從事神經(jīng)機(jī)器翻譯工作。聯(lián)系方式: [email protected]

歡迎加入本站公開興趣群

商業(yè)智能與數(shù)據(jù)分析群

興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價(jià)值的辦法,實(shí)際應(yīng)用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉(cāng)庫(kù),數(shù)據(jù)挖掘工具,報(bào)表系統(tǒng)等全方位知識(shí)

QQ群:81035754

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/4470.html

相關(guān)文章

  • TensorFlow 刪除 YAML 支持,建議 JSON 作為替補(bǔ)方案!

    摘要:據(jù)公告稱,和的包裝庫(kù)使用了不安全的函數(shù)來(lái)反序列化編碼的機(jī)器學(xué)習(xí)模型。簡(jiǎn)單來(lái)看,序列化將對(duì)象轉(zhuǎn)換為字節(jié)流。據(jù)悉,本次漏洞影響與版本,的到版本均受影響。作為解決方案,在宣布棄用之后,團(tuán)隊(duì)建議開發(fā)者以替代序列化,或使用序列化作為替代。 ...

    BlackFlagBin 評(píng)論0 收藏0
  • 深度學(xué)習(xí)

    摘要:深度學(xué)習(xí)在過去的幾年里取得了許多驚人的成果,均與息息相關(guān)。機(jī)器學(xué)習(xí)進(jìn)階筆記之一安裝與入門是基于進(jìn)行研發(fā)的第二代人工智能學(xué)習(xí)系統(tǒng),被廣泛用于語(yǔ)音識(shí)別或圖像識(shí)別等多項(xiàng)機(jī)器深度學(xué)習(xí)領(lǐng)域。零基礎(chǔ)入門深度學(xué)習(xí)長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)。 多圖|入門必看:萬(wàn)字長(zhǎng)文帶你輕松了解LSTM全貌 作者 | Edwin Chen編譯 | AI100第一次接觸長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)(LSTM)時(shí),我驚呆了。原來(lái),LSTM是神...

    Vultr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<