tensorflow计算图_简单谈谈Tensorflow的运行机制
1 前言
由于Tensorflow采用了全新的靜態(tài)圖設(shè)計(jì)模式,所以其運(yùn)行機(jī)制與我們腦中所熟悉的動(dòng)態(tài)圖有著截然不同之處。TensorFlow翻譯成中文就是張量流,所以TensorFlow至少代表著兩個(gè)概念:“張量”和“流”。這兒我們不過(guò)多的追究什么是張量,在Tensorflow中它基本上就相當(dāng)于numpy中的array,下面關(guān)鍵要說(shuō)的是這個(gè)“流”。
怎么來(lái)說(shuō)明這個(gè)“流”呢?我們先來(lái)看一段用python寫的普通代碼:
a=1 print("a=",a) # a = 1 b=2 print("b=",b) # b = 2 c=a+b print("c=",c) # c = 3 d=b+2 print("d=",d) # d = 4 e=c*d print("e=",e) # e = 13這看起來(lái)似乎也很平常沒(méi)有什么特別之處,當(dāng)然這確實(shí)沒(méi)什么值得要說(shuō)的。之所以這么認(rèn)為是因?yàn)闆](méi)有對(duì)比,所謂沒(méi)有對(duì)比就沒(méi)有傷害。下面我們用TensorFlow框架再來(lái)把這段程序?qū)懸槐?#xff1a;
import tensorflow as tf a=tf.constant([1],dtype=tf.int32,name='iama') print(a) b=tf.constant([2],dtype=tf.int32,name='iamb') print(b) c=a+b print(c) d=b+2 print(d) e=c*d print(e)結(jié)果: Tensor("iama:0", shape=(1,), dtype=int32) Tensor("iamb:0", shape=(1,), dtype=int32) Tensor("add:0", shape=(1,), dtype=int32) Tensor("add_1:0", shape=(1,), dtype=int32) Tensor("mul:0", shape=(1,), dtype=int32)發(fā)現(xiàn)沒(méi)有,居然和我們想象中的結(jié)果不一樣,輸出來(lái)的只是每個(gè)變量的信息。那這么樣才能得到我們想象中的結(jié)果呢?在第18號(hào)后面加上如下幾句代碼即可:
with tf.Session() as sess:print(sess.run(a))print(sess.run(b))print(sess.run(c))print(sess.run(d))print(sess.run(e))為什么Tensorflow需要通過(guò)這種形式來(lái)執(zhí)行代碼呢?
2 計(jì)算圖
從上面的兩個(gè)例子可以發(fā)現(xiàn):
(1)傳統(tǒng)方式寫的程序,對(duì)于任意一個(gè)變量,我們隨時(shí)都可以輸出其結(jié)果,這種稱為動(dòng)態(tài)圖模式;
(2)用TensorFlow框架寫的程序,對(duì)于每一個(gè)變量,我們必須run()一下才能得到其對(duì)應(yīng)的結(jié)果。
在Tensorflow中為什么會(huì)這樣呢?根據(jù)上面的程序,我們可以大致畫出如下一個(gè)計(jì)算圖:
圖 1. 計(jì)算圖如圖1所示,里面的每一個(gè)節(jié)點(diǎn)表示的僅僅只是其對(duì)應(yīng)的結(jié)構(gòu)信息(形狀,類型,操作等),并不是代表其真實(shí)的值。如果直接輸出節(jié)點(diǎn),實(shí)際上則是輸出的對(duì)應(yīng)節(jié)點(diǎn)的信息。例如a節(jié)點(diǎn)為"iama:0", shape=(1,), dtype=int32;c節(jié)點(diǎn)為Tensor("add:0", shape=(1,), dtype=int32),其中add`是指c這個(gè)變量是通過(guò)加法操作得到的。
而每一條邊則表示各個(gè)變量之間的依賴關(guān)系。如c依賴于a,b;a,b不依賴于任何變量。當(dāng)執(zhí)行run()的時(shí)候,就對(duì)應(yīng)執(zhí)行每個(gè)節(jié)點(diǎn)上所對(duì)應(yīng)的操作,并且返回這個(gè)操作后的結(jié)果,這就是TensorFlow的設(shè)計(jì)理念——先定義計(jì)算圖,等計(jì)算圖定義完成后再通過(guò)會(huì)話模式來(lái)執(zhí)行計(jì)算圖上的操作。
例如:
在執(zhí)行run(a)時(shí),就對(duì)應(yīng)把1賦值給常量a;
在執(zhí)行run(c)時(shí),就對(duì)應(yīng)先把1賦值給常量a,再把2賦值給常量b,最后把a(bǔ)+b這個(gè)操作后的結(jié)果賦值給c;
在執(zhí)行run(e)時(shí),就對(duì)應(yīng)把圖中所有的操作都執(zhí)行一遍,也就是說(shuō)TensorFlow會(huì)根據(jù)圖中的依賴關(guān)系自動(dòng)處理。
因此,對(duì)于上述運(yùn)行機(jī)制,我們可以通過(guò)圖2來(lái)形象的進(jìn)行表示??梢园l(fā)現(xiàn),所有的操作就像是水一樣從初始節(jié)點(diǎn)“流”向終止節(jié)點(diǎn)。
圖 2. Tensorflow運(yùn)行機(jī)制圖圖片來(lái)自:https://dorianbrown.dev/mnist-tensorflow/
由此我們可以知道:run(node)的本質(zhì)就是執(zhí)行所有node所依賴的節(jié)點(diǎn)對(duì)應(yīng)的操作,并且返回node節(jié)點(diǎn)對(duì)應(yīng)操作后的值。所以,利用TensorFlow框架寫程序時(shí)定義的每一變量、常量,其實(shí)都只是在計(jì)算圖上生成了一個(gè)對(duì)應(yīng)的節(jié)點(diǎn)。
3 占位符
說(shuō)完計(jì)算圖我們?cè)賮?lái)說(shuō)Tensorflow中的占位符(tf.placeholder)就很容易理解了。從圖1可知,c、d和e三個(gè)節(jié)點(diǎn)是依賴于其前驅(qū)節(jié)點(diǎn)所生成;而唯獨(dú)節(jié)點(diǎn)a和b并不依賴于任何前驅(qū)節(jié)點(diǎn)。這是因?yàn)楣?jié)點(diǎn)a和b是計(jì)算圖中的原始輸入,所以才不會(huì)依賴于其它節(jié)點(diǎn)。但是雖然說(shuō)a和b不依賴于別的節(jié)點(diǎn),但是別的節(jié)點(diǎn)得依賴于a和b呀。怎么辦呢?
Tensoflow說(shuō)那既然是這樣,咱們就先給它挖個(gè)坑把地方占住吧,等計(jì)算圖執(zhí)行的時(shí)候我們?cè)俳o這些坑填入原始的輸入即可。就這樣,Tensorflow中誕生了一個(gè)讓很多人莫名疑惑的tf.placeholder()。
本次內(nèi)容就到此結(jié)束,感謝您的閱讀!若有任何疑問(wèn)與建議,請(qǐng)?zhí)砑庸P者微信'nulls8'進(jìn)行交流。青山不改,綠水長(zhǎng)流,我們?cè)聛?lái)客棧見(jiàn)!
近期文章
[1]你們要的Tensorflow入坑指南來(lái)了
總結(jié)
以上是生活随笔為你收集整理的tensorflow计算图_简单谈谈Tensorflow的运行机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python怎么命名未知数_码如其人,小
- 下一篇: springboot 接口404_资深架