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