動(dòng)態(tài)圖機(jī)制 Eager Execution 簡(jiǎn)介

轉(zhuǎn)載自 Hujun/Sanglei

【導(dǎo)讀】主題鏈路知識(shí)是我們專知的核心功能之一吱肌,為用戶提供AI領(lǐng)域系統(tǒng)性的知識(shí)學(xué)習(xí)服務(wù)溃卡,一站式學(xué)習(xí)人工智能的知識(shí)悠鞍,包含人工智能( 機(jī)器學(xué)習(xí)吨岭、自然語(yǔ)言處理、計(jì)算機(jī)視覺(jué)等)车荔、大數(shù)據(jù)渡冻、編程語(yǔ)言、系統(tǒng)架構(gòu)忧便。使用請(qǐng)?jiān)L問(wèn)專知 進(jìn)行主題搜索查看 - 桌面電腦訪問(wèn)http://www.zhuanzhi.ai, 手機(jī)端訪問(wèn)http://www.zhuanzhi.ai 或關(guān)注微信公眾號(hào)后臺(tái)回復(fù)" 專知"進(jìn)入專知族吻,搜索主題查看。隨著TensorFlow 1.4 Eager Execution的出現(xiàn)珠增,TensorFlow的使用出現(xiàn)了革命性的變化超歌。專知為大家推出TensorFlow 1.4系列教程:

簡(jiǎn)介

近期PyTorch比較火,并不是因?yàn)镻yTorch輪子多或者生態(tài)圈龐大蒂教,而是因?yàn)镻yTorch可以構(gòu)建動(dòng)態(tài)圖巍举,即可以像正常程序一樣去編寫或者調(diào)試深度學(xué)習(xí)模型。1.4版本之前的Tensorflow一直被人詬病的一個(gè)問(wèn)題就是它不具備構(gòu)建動(dòng)態(tài)圖的能力凝垛。Tensorflow 1.4的Eager Execution在兼容老版本的基礎(chǔ)上懊悯,提供了動(dòng)態(tài)圖以及其它的一些新特性蜓谋,通俗地來(lái)說(shuō)有下面幾個(gè)特點(diǎn):

  • 無(wú)需Placeholder和Feed,可以直接使用numpy作為輸入

  • 可以立即執(zhí)行Operation炭分,例如輸入圖像數(shù)據(jù)(numpy)桃焕,立即輸出卷積結(jié)果,并將結(jié)果轉(zhuǎn)換為numpy欠窒。即可以將老版本中定義靜態(tài)圖的Operation直接當(dāng)做函數(shù)來(lái)立即執(zhí)行一個(gè)Operation覆旭。(老版本需要先利用Operation定義靜態(tài)圖,然后到Session中執(zhí)行不可變的靜態(tài)圖岖妄,并且獲取Operation的結(jié)果需要通過(guò)sess.run()和feed型将,非常麻煩)。

  • 動(dòng)態(tài)圖特性使得Tensorflow可以使用python的if語(yǔ)句和循環(huán)語(yǔ)句來(lái)控制模型的結(jié)構(gòu)荐虐,而不用通過(guò)tf.cond這種難用的函數(shù)來(lái)控制模型的解構(gòu)七兜。

  • 動(dòng)態(tài)圖特性使得模型更便于調(diào)試,模型的運(yùn)行過(guò)程與代碼的運(yùn)行過(guò)程一致福扬。而在老版本的靜態(tài)圖中腕铸,網(wǎng)絡(luò)的forward與backward都是黑箱操作,想加個(gè)print來(lái)輸出過(guò)程中的變量都很難铛碑。

  • 梯度的計(jì)算和更新也變成函數(shù)的調(diào)用狠裹,可由開(kāi)發(fā)者自己調(diào)用。

  • 上述的Eager Execution特性的實(shí)現(xiàn)汽烦,只需在代碼頂部加上下面兩行代碼即可涛菠,其他的操作均兼容老版本的API:

    import tensorflow.contrib.eager as tfe
    tfe.enable_eager_execution()
    
    

安裝

想體驗(yàn)1.4版Tensorflow的,可以用pip下載nightly build版本的Tensorflow:

  • CPU: pip install tf-nightly
  • GPU: pip install tf-nightly-gpu

注意撇吞,使用GPU版需要安裝cuDNN 6以上的版本俗冻。在Windows上推薦使用conda(python3.5)+pip進(jìn)行安裝。

示例

下面用一些示例來(lái)展示Eager Execution為我們帶來(lái)的禮物牍颈。

下面所有的示例都依賴下面的import:

import tensorflow as tf
import tensorflow.contrib.eager as tfe
import numpy as np
tfe.enable_eager_execution()

示例1迄薄,直接使用Operation進(jìn)行卷積操作

# 隨機(jī)生成2個(gè)圖像(batch_size=2),每個(gè)圖像的大小為 28 * 28 * 3
images = np.random.randn(2, 28, 28, 3).astype(np.float32)
# 卷積核參數(shù)
filter = tf.get_variable("conv_w0", shape = [5,5,3,20], initializer = tf.truncated_normal_initializer)
# 對(duì)生成的batch_size=2的數(shù)據(jù)進(jìn)行卷積操作煮岁,立即獲得結(jié)果
conv = tf.nn.conv2d(input = images, filter = filter, strides = [1,2,2,1], padding = 'VALID')
# 用結(jié)果的numpy()方法可獲得結(jié)果的numpy表示讥蔽,顯示其shape
print(conv.numpy().shape)

運(yùn)行結(jié)果如下,成功獲得卷積后結(jié)果的大小画机。

(2, 12, 12, 20)

示例2冶伞,自動(dòng)計(jì)算梯度

x*x + 40自動(dòng)求導(dǎo):

grad = tfe.gradients_function(lambda x: x * x + 4.0)
print(grad(10))
print(grad(5))

計(jì)算結(jié)果:

[<tf.Tensor: id=11, shape=(), dtype=int32, numpy=20>]
[<tf.Tensor: id=22, shape=(), dtype=int32, numpy=10>]

可以看到,輸入為10和5時(shí)的導(dǎo)數(shù)為20和10色罚。

示例3,使用Python的程序流程控制模型的流程

自己動(dòng)手實(shí)現(xiàn)leaky relu激活函數(shù):

def leaky_relu(x):
    if x < 0:
        return x * 0.1
    else:
        return x
grad = tfe.gradients_function(leaky_relu)
print(grad(4.0))
print(grad(-3.0))

代碼運(yùn)行記結(jié)果如下:

[<tf.Tensor: id=9, shape=(), dtype=float32, numpy=1.0>]
[<tf.Tensor: id=21, shape=(), dtype=float32, numpy=0.1>]

結(jié)果中的1.0和0.1分別是leaky relu對(duì)于輸入4和-3的梯度账劲〈粱ぃ可以看出金抡,leakly relu需要條件語(yǔ)句來(lái)控制流程,上面代碼在老版本TensorFlow里是不可行的腌且,因?yàn)闂l件語(yǔ)句的判斷會(huì)發(fā)生在定義靜態(tài)圖的階段梗肝,而定義靜態(tài)圖的階段連輸入數(shù)據(jù)是啥都不知道。

示例4铺董,自動(dòng)優(yōu)化

w = tf.get_variable("w", initializer = 3.0)
def loss(x):
    return x * w
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
for i in range(5):
    optimizer.minimize(lambda: loss(5))
    print(w.numpy())

運(yùn)行結(jié)果如下巫击,可以看出變量w的值在不斷被更新,以減小loss的值

2.5
2.0
1.5
1.0
0.5

分布式和多GPU

TensorFlow的Github上對(duì)于Eager Execution的描述如下:

This feature is in early stages and work remains to be done in terms of smooth support for distributed and multi-GPU training and CPU performance.

意思是說(shuō)精续,Eager Execution仍然是一個(gè)新特性坝锰,對(duì)于分布式訓(xùn)練、多GPU訓(xùn)練和CPU的性能重付,仍有很多的工作可做顷级。對(duì)于想使用分布式訓(xùn)練的朋友來(lái)說(shuō),還是老老實(shí)實(shí)先用TensorFlow的靜態(tài)圖吧确垫。下面這段引用描述了TensorFlow的分布式運(yùn)行方法:

TensorFlow是Google開(kāi)源的基于神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)引擎弓颈,可以支持分布式運(yùn)行。通常構(gòu)建單一的包含了一系列參數(shù)的圖, 并且創(chuàng)建多個(gè)模型的副本來(lái)映射到不同tasks删掀。每個(gè)model的副本有一個(gè)不同的train_op翔冀,并且對(duì)于每個(gè)Worker service而言一個(gè)或者多個(gè)的客戶端線程可以調(diào)用sess.run(train_ops[i])。這種方法只使用了單一的tf.Session披泪,它的工作目標(biāo)是集群中的某個(gè)workers纤子。而另一種分布式訓(xùn)練器的方法使用多張圖,一張圖對(duì)應(yīng)一個(gè)worker付呕,并且每張圖都包含了一系列的參數(shù)的集合和一份模型的賦值计福。而容器的機(jī)制就是在不同的圖之間共享變量:一旦某個(gè)變量構(gòu)造完成,可選的container參數(shù)會(huì)由圖中每份復(fù)制的相同值來(lái)決定徽职。對(duì)于較大的模型而言象颖,這種方法會(huì)更加有效,畢竟整個(gè)圖更小了一點(diǎn)姆钉。這種方法就需要使用多個(gè)tf.Session對(duì)象:每個(gè)worker過(guò)程都會(huì)包含一個(gè)说订,不過(guò)不同的Session會(huì)指向不同的目標(biāo)worker。這個(gè)tf.Session對(duì)象即可以在單一的Python客戶端中創(chuàng)建潮瓶,也可以在多個(gè)客戶端中創(chuàng)建陶冷。

性能

國(guó)外一些人在博客里公布了一些Eager Execution和PyTorch的對(duì)比,總的來(lái)說(shuō)毯辅,就是目前TensorFlow的Eager Execution特性并不是特別理想埂伦,但正如上面所說(shuō),Eager正處于非常初級(jí)的階段思恐,相信Google可以很快地將Eager特性完善沾谜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膊毁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子基跑,更是在濱河造成了極大的恐慌婚温,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媳否,死亡現(xiàn)場(chǎng)離奇詭異栅螟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)篱竭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門力图,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人室抽,你說(shuō)我怎么就攤上這事搪哪。” “怎么了坪圾?”我有些...
    開(kāi)封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵晓折,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我兽泄,道長(zhǎng)漓概,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任病梢,我火速辦了婚禮胃珍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜓陌。我一直安慰自己觅彰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布钮热。 她就那樣靜靜地躺著填抬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隧期。 梳的紋絲不亂的頭發(fā)上飒责,一...
    開(kāi)封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音仆潮,去河邊找鬼宏蛉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛性置,可吹牛的內(nèi)容都是我干的拾并。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嗅义!你這毒婦竟也來(lái)了个榕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芥喇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后凰萨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體继控,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年胖眷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了武通。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡珊搀,死狀恐怖冶忱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情境析,我是刑警寧澤囚枪,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站劳淆,受9級(jí)特大地震影響链沼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沛鸵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一括勺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曲掰,春花似錦疾捍、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至底哥,卻和暖如春咙鞍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趾徽。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工续滋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孵奶。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓疲酌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朗恳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 原文來(lái)源:Google Brain 作者:Asim Shankar 湿颅、 Wolff Dobson 「雷克世界」編譯...
    MiracleJQ閱讀 6,512評(píng)論 0 1
  • 1. 介紹 首先讓我們來(lái)看看TensorFlow! 但是在我們開(kāi)始之前粥诫,我們先來(lái)看看Python API中的Ten...
    JasonJe閱讀 11,756評(píng)論 1 32
  • 【這是“心靈對(duì)話-寫作小組” 第5篇文章】小伙伴撰文寫茶癡油航,文中描繪的那粉衣白裙女子,其愛(ài)茶之深切之專情之義無(wú)反顧...
    芯語(yǔ)星愿閱讀 194評(píng)論 0 0
  • 聽(tīng)過(guò)很多道理怀浆,卻依然過(guò)不好這一生谊囚。 從小到大,道理聽(tīng)了成百上千個(gè)执赡,自以為知道了就是擁有镰踏,該用它的時(shí)候自然就為我所用...
    李大刀閱讀 446評(píng)論 0 47
  • 第一次聽(tīng)到這句話時(shí),我有點(diǎn)懵懂沙合,點(diǎn)點(diǎn)頭但不敢茍同奠伪,因?yàn)楫?dāng)時(shí)的我就沒(méi)有這樣的夢(mèng)想,覺(jué)得太夸張了首懈。 走到今日绊率,依舊認(rèn)為...
    祁百草閱讀 1,364評(píng)論 15 31