【TensorFlow實(shí)戰(zhàn)——筆記】第1章:TensorFlow基礎(chǔ)

1.1 TensorFlow概要

TensorFlow是Google公司開(kāi)源的分布式機(jī)器學(xué)習(xí)框架氢妈。它的前身是DistBelief,在Google大規(guī)模內(nèi)部使用现恼。TensorFlow最早由Google Brain研究組發(fā)起。

官網(wǎng):http://www.tersorflow.org
Github網(wǎng)址:https://github.com/tensorflow/tensorflow
模型倉(cāng)庫(kù)網(wǎng)址:https://github.com/tensorflow/models

TensorFlow關(guān)鍵版本發(fā)布?xì)v史

  • 2015.11.09 在Github上開(kāi)源(Ver0.5.0)
  • 2015.12.10 支持Python3.3+,GPU性能提升...(Ver0.6.0)
  • 2016.02.17 支持GPU使用Cuda7.0+捆愁、cuDNN R2+、cuDNN R4等運(yùn)算加速庫(kù)...(Ver0.7.0)
  • 2016.04.30 通過(guò)gRPC實(shí)現(xiàn)分布式計(jì)算...(Ver0.8.0)
  • 2016.06.28 支持Python3.5窟却,支持iOS昼丑,支持Mac電腦上的GPU計(jì)算...(Ver0.9.0)
  • 2016.09.13 添加C++ shape inference,添加graph-construction C/C++(大部分) Api...(Ver0.10.0)
  • 2016.11.11 支持cuDNN 5夸赫、Cuda8.0菩帝,HDFS...(Ver0.11.0)
  • 2016.12.21 支持Windows環(huán)境運(yùn)行,cuDNN 5.1...(Ver0.12.0)
  • 2017.02.16 發(fā)布正式版(Ver1.0.0)
  • 2017.04.27 支持Windows下的Java Api...(Ver1.1.0)
  • 2017.06.15 支持Windows下的Python 3.6...(Ver1.2.0)

前端API支持語(yǔ)言

  • Python (推薦使用茬腿,API最全面)
  • C++
  • Go
  • Java
  • Rust
  • Haskell
  • 非官方(Julia呼奢、Javascript、R)

運(yùn)算操作硬件

  • CPU: Linux, Mac, Windows, Android, iOS
  • GPU: Linux, Mac, Windows
  • TPU: Tensor Processing Unit(Google專(zhuān)門(mén)為大規(guī)模深度學(xué)習(xí)計(jì)算定制的芯片切平,內(nèi)部使用握础,AlphaGo采用)

應(yīng)用場(chǎng)景

  • 語(yǔ)音識(shí)別
  • 自然語(yǔ)言處理
  • 計(jì)算機(jī)視覺(jué)
  • 機(jī)器人控制
  • 信息抽取
  • 藥物研發(fā)
  • 分子活動(dòng)預(yù)測(cè)
  • ...

其他

  • 編程模型:Dataflow-like model(數(shù)據(jù)流模型)
  • 部署:一套代碼,全平臺(tái)運(yùn)行
  • 運(yùn)行模式:?jiǎn)螜C(jī)悴品、分布式
  • 數(shù)學(xué)表達(dá):Math Graph Expression(數(shù)學(xué)計(jì)算圖表達(dá))禀综、Auto Differentiation(自動(dòng)微分)
  • 平臺(tái)支持:Google Cloud Platform、Hadoop File System

1.2 TensorFlow編程模型簡(jiǎn)介

TensorFlow的計(jì)算可以表示為一種有向圖(directed graph)苔严,或者稱(chēng)計(jì)算圖(computation graph)定枷。圖中每一個(gè)運(yùn)算操作(operation)是一個(gè)節(jié)點(diǎn)(node),節(jié)點(diǎn)之間的連接線稱(chēng)為邊(edge)届氢。計(jì)算圖中的節(jié)點(diǎn)可以有任意多個(gè)輸入和任意多個(gè)輸出欠窒,每個(gè)節(jié)點(diǎn)都只有一個(gè)運(yùn)算操作。在計(jì)算圖中流動(dòng)(flow)的數(shù)據(jù)被稱(chēng)為張量(tensor)退子,故得名TensorFlow贱迟。

計(jì)算圖示例

import tensorflow as tf
b=tf.Variable(tf.zeros([100]))      # 生成100維的向量姐扮,初始化為0
W=tf.Variable(tf.random_uniform([784,100],-1,1))    # 生成784x100的隨機(jī)矩陣W
x=tf.placeholder(name="x")      # 輸入的Placeholder
relu=tf.nn.relu(tf.matmul(W, x)+b)  # ReLU(Wx+b)
C=[...]         # 根據(jù)ReLU函數(shù)的結(jié)果計(jì)算Cost
s=tf.Session()
for step in range(0, 10):
    input=...construct 100-D input array... # 為輸入創(chuàng)建一個(gè)100維的向量
    result=s.run(C, feed_dict={x: input})   # 獲取Cost,供給輸入x
    print(step, result)

Session是用戶使用TensorFlow時(shí)交互的接口衣吠。Session可以通過(guò)Extend方法添加節(jié)點(diǎn)(node)和邊(edge)茶敏。Variable是一類(lèi)特殊的運(yùn)算操作,可以將tensor存儲(chǔ)在內(nèi)存或顯存中缚俏。

內(nèi)建運(yùn)算操作

  • 標(biāo)量運(yùn)算:Add惊搏、Sub、Mul忧换、Div恬惯、Exp、Log亚茬、Greater酪耳、Less、Equal
  • 向量運(yùn)算:Concat刹缝、Slice碗暗、Split、Constant梢夯、Rank言疗、Shape、Shuffle
  • 矩陣運(yùn)算:MatMul颂砸、MatrixInverse噪奄、MatrixDeterminant
  • 帶狀態(tài)的運(yùn)算:Variable、Assign人乓、AssignAdd
  • 神經(jīng)網(wǎng)絡(luò)組件:SoftMax勤篮、Sigmoid、ReLU色罚、Convolution2D碰缔、MaxPooling
  • 存儲(chǔ)、恢復(fù):Save保屯、Restore
  • 隊(duì)列及同步運(yùn)算:Enqueue手负、Dequeue、MutexAcquire姑尺、MutexRelease
  • 控制流:Merge竟终、Switch、Enter切蟋、Leave统捶、NextIteration

工作組件

  • client:客戶端執(zhí)行session run與master相連
  • master:指導(dǎo)所有worker按流程執(zhí)行計(jì)算圖
  • worker:與多個(gè)硬件設(shè)備(device)相連,并管理他們

每一個(gè)worker管理多個(gè)設(shè)備,設(shè)備的name包含硬件類(lèi)別喘鸟、編號(hào)匆绣、任務(wù)號(hào)(單機(jī)版沒(méi)有),例如:

單機(jī)模式:/job:localhost/device:cpu:0
分布式模式: /job:worker/task:17/device:gpu:3

運(yùn)行模式

  • 單機(jī)模式:計(jì)算圖會(huì)按依賴關(guān)系被順序執(zhí)行什黑。當(dāng)一個(gè)節(jié)點(diǎn)的所有前置節(jié)點(diǎn)執(zhí)行完時(shí)(依賴數(shù)為0)崎淳,這個(gè)節(jié)點(diǎn)就會(huì)被加入ready queue以等待執(zhí)行;同時(shí)愕把,它后置的所有節(jié)點(diǎn)依賴數(shù)減1拣凹,這就是標(biāo)準(zhǔn)的計(jì)算拓?fù)浞绞健?/strong>
  • 分布式模式:設(shè)計(jì)了一套節(jié)點(diǎn)(node)分配設(shè)備策略。 通過(guò)計(jì)算一個(gè)代價(jià)模型恨豁,估算每一個(gè)節(jié)點(diǎn)的輸入嚣镜、輸出tensor的大小和所需的時(shí)間。代價(jià)模型由人工經(jīng)驗(yàn)制定也可由實(shí)際運(yùn)算測(cè)量得到橘蜜。策略確定后菊匿,計(jì)算圖會(huì)被劃分成許多子圖,使用同一設(shè)備且相鄰的節(jié)點(diǎn)會(huì)被劃分到同一個(gè)子圖计福。子圖劃分的圖例如下:

單機(jī)單設(shè)備(device)改造成單機(jī)多設(shè)備(device)

for i in range(8):
    for d in range(4):
        with tf.device("/gpu:%d" % d):
            input = x[i] if d is 0 else m[d-1]
            m[d], c[d] = LSTMCell(input, mprev[d], cpev[d])
            mprev[d] = m[d]
            cprev[d] = c[d]

分布式容錯(cuò)性

  • 信息從發(fā)送節(jié)點(diǎn)傳輸?shù)浇邮展?jié)點(diǎn)失敗時(shí)
  • 周期性的worker心跳檢測(cè)失敗時(shí)

當(dāng)一個(gè)故障被檢測(cè)到跌捆,整個(gè)計(jì)算圖會(huì)終止并重啟。

擴(kuò)展功能

  • 原生支持自動(dòng)求導(dǎo)(以后學(xué)習(xí))
  • 支持單獨(dú)執(zhí)行子圖:bar:0表示名為bar的節(jié)點(diǎn)的第1個(gè)輸出棒搜,輸入數(shù)據(jù)的節(jié)點(diǎn)會(huì)連接一個(gè)feed node疹蛉,輸出的節(jié)點(diǎn)會(huì)連接一個(gè)fetch node
  • 支持計(jì)算圖的控制流:if-condition活箕、while-loop力麸、Switch、Merge育韩、Enter克蚂、Leave、NextIteration
  • 數(shù)據(jù)輸入除了feed node筋讨,還有特殊的input node直接輸入文件系統(tǒng)的路徑埃叭,從client讀取
  • 隊(duì)列(queue):用于任務(wù)調(diào)度,讓計(jì)算圖的不同節(jié)點(diǎn)異步執(zhí)行
  • 容器(container):管理長(zhǎng)期變量悉罕,比如Variable等

性能優(yōu)化

高度優(yōu)化的三方計(jì)算庫(kù)

  • 線性代數(shù)計(jì)算庫(kù):Eigen
  • 矩陣乘法計(jì)算庫(kù):BLAS赤屋、cuBLAS(CUDA BLAS)
  • 深度學(xué)習(xí)計(jì)算庫(kù):cuda-convnet、cuDNN

加速神經(jīng)網(wǎng)絡(luò)訓(xùn)練的并行計(jì)算模式

  • 數(shù)據(jù)并行:通過(guò)將一個(gè)mini-batch數(shù)據(jù)放在不同的設(shè)備上計(jì)算壁袄,實(shí)現(xiàn)梯度計(jì)算的并行化类早。計(jì)算還可以分同步、異步和混合三種方式嗜逻。同步的優(yōu)點(diǎn)是沒(méi)有梯度干擾涩僻,缺點(diǎn)是容錯(cuò)性差,一臺(tái)機(jī)器出現(xiàn)問(wèn)題后要重跑;異步的優(yōu)點(diǎn)是有一定容錯(cuò)性逆日,但是受梯度影響問(wèn)題嵌巷,導(dǎo)致每組梯度利用效率下降。
  • 模型并行:將計(jì)算圖的不同部分放在不同的設(shè)備上運(yùn)算室抽,可以實(shí)現(xiàn)簡(jiǎn)單模型的并行搪哪。
  • 流水線并行:和異步的數(shù)據(jù)并行很像,只不過(guò)是在同一個(gè)硬件設(shè)備上實(shí)現(xiàn)并行坪圾,提高設(shè)備利用率噩死。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市神年,隨后出現(xiàn)的幾起案子已维,更是在濱河造成了極大的恐慌,老刑警劉巖已日,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垛耳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡飘千,警方通過(guò)查閱死者的電腦和手機(jī)堂鲜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)护奈,“玉大人缔莲,你說(shuō)我怎么就攤上這事∶蛊欤” “怎么了痴奏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)厌秒。 經(jīng)常有香客問(wèn)我读拆,道長(zhǎng),這世上最難降的妖魔是什么鸵闪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任檐晕,我火速辦了婚禮,結(jié)果婚禮上蚌讼,老公的妹妹穿的比我還像新娘辟灰。我一直安慰自己,他們只是感情好篡石,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布芥喇。 她就那樣靜靜地躺著,像睡著了一般夏志。 火紅的嫁衣襯著肌膚如雪乃坤。 梳的紋絲不亂的頭發(fā)上苛让,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音湿诊,去河邊找鬼狱杰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛厅须,可吹牛的內(nèi)容都是我干的仿畸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼朗和,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼错沽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起眶拉,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤千埃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后忆植,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體放可,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年朝刊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耀里。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拾氓,死狀恐怖冯挎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咙鞍,我是刑警寧澤房官,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站奶陈,受9級(jí)特大地震影響易阳,放射性物質(zhì)發(fā)生泄漏附较。R本人自食惡果不足惜吃粒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拒课。 院中可真熱鬧徐勃,春花似錦、人聲如沸早像。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卢鹦。三九已至臀脏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揉稚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工秒啦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搀玖。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓余境,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親灌诅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芳来,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容