欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Tensorflow中的圖(tf.Graph)和會話(tf.Session)的實現(xiàn)

 更新時間:2020年04月22日 15:33:35   作者:You-wh  
這篇文章主要介紹了Tensorflow中的圖(tf.Graph)和會話(tf.Session)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Tensorflow編程系統(tǒng)

Tensorflow工具或者說深度學(xué)習(xí)本身就是一個連貫緊密的系統(tǒng)。一般的系統(tǒng)是一個自治獨立的、能實現(xiàn)復(fù)雜功能的整體。系統(tǒng)的主要任務(wù)是對輸入進行處理,以得到想要的輸出結(jié)果。我們之前見過的很多系統(tǒng)都是線性的,就像汽車生產(chǎn)工廠的流水線一樣,輸入->系統(tǒng)處理->輸出。系統(tǒng)內(nèi)部由很多單一的基本部件構(gòu)成,這些單一部件具有特定的功能,且需要穩(wěn)定的特性;系統(tǒng)設(shè)計者通過特殊的連接方式,讓這些簡單部件進行連接,以使它們之間可以進行數(shù)據(jù)交流和信息互換,來達到相互配合而完成具體工作的目的。

對于任何一個系統(tǒng)來說,都應(yīng)該擁有穩(wěn)定、獨立、能處理特殊任務(wù)的單一部件;且擁有一套良好的內(nèi)部溝通機制,以讓系統(tǒng)可以健康安全的運行。

現(xiàn)實中的很多系統(tǒng)都是線性的,被設(shè)計好的、不能進行更改的,比如工廠的流水線,這樣的系統(tǒng)并不具備自我調(diào)整的能力,無法對外界的環(huán)境做出反應(yīng),因此也就不具備“智能”。

深度學(xué)習(xí)(神經(jīng)網(wǎng)絡(luò))之所以具備智能,就是因為它具有反饋機制。深度學(xué)習(xí)具有一套對輸出所做的評價函數(shù)(損失函數(shù)),損失函數(shù)在對神經(jīng)網(wǎng)絡(luò)做出評價后,會通過某種方式(梯度下降法)更新網(wǎng)絡(luò)的組成參數(shù),以期望系統(tǒng)得到更好的輸出數(shù)據(jù)。

由此可見,神經(jīng)網(wǎng)絡(luò)的系統(tǒng)主要由以下幾個方面組成:

  • 輸入
  • 系統(tǒng)本身(神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)),以及涉及到系統(tǒng)本身構(gòu)建的問題:如網(wǎng)絡(luò)構(gòu)建方式、網(wǎng)絡(luò)執(zhí)行方式、變量維護、模型存儲和恢復(fù)等等問題
  • 損失函數(shù)
  • 反饋方式:訓(xùn)練方式

定義好以上的組成部分,我們就可以用流程化的方式將其組合起來,讓系統(tǒng)對輸入進行學(xué)習(xí),調(diào)整參數(shù)。因為該系統(tǒng)的反饋機制,所以,組成的方式肯定需要循環(huán)。

而對于Tensorflow來說,其設(shè)計理念肯定離不開神經(jīng)網(wǎng)絡(luò)本身。所以,學(xué)習(xí)Tensorflow之前,對神經(jīng)網(wǎng)絡(luò)有一個整體、深刻的理解也是必須的。如下圖:Tensorflow的執(zhí)行示意。

那么對于以上所列的幾點,什么才是最重要的呢?我想肯定是有關(guān)系統(tǒng)本身所涉及到的問題。即如何構(gòu)建、執(zhí)行一個神經(jīng)網(wǎng)絡(luò)?在Tensorflow中,用計算圖來構(gòu)建網(wǎng)絡(luò),用會話來具體執(zhí)行網(wǎng)絡(luò)。深入理解了這兩點,我想,對于Tensorflow的設(shè)計思路,以及運行機制,也就略知一二了。

圖(tf.Graph):計算圖,主要用于構(gòu)建網(wǎng)絡(luò),本身不進行任何實際的計算。計算圖的設(shè)計啟發(fā)是高等數(shù)學(xué)里面的鏈?zhǔn)角髮?dǎo)法則的圖。我們可以將計算圖理解為是一個計算模板或者計劃書。

會話(tf.session):會話,主要用于執(zhí)行網(wǎng)絡(luò)。所有關(guān)于神經(jīng)網(wǎng)絡(luò)的計算都在這里進行,它執(zhí)行的依據(jù)是計算圖或者計算圖的一部分,同時,會話也會負責(zé)分配計算資源和變量存放,以及維護執(zhí)行過程中的變量。

接下來,我們主要從計算圖開始,看一看Tensorflow是如何構(gòu)建、執(zhí)行網(wǎng)絡(luò)的。

計算圖

在開始之前,我們先復(fù)習(xí)一下Tensorflow的幾種基本數(shù)據(jù)類型:

tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False)
tf.Variable(initializer, name)
tf.placeholder(dtype, shape=None, name=None)

復(fù)習(xí)完畢。

graph = tf.Graph()
with graph.as_default():
 img = tf.constant(1.0, shape=[1,5,5,3])

以上代碼中定義了一個計算圖,在該計算圖中定義了一個常量。Tensorflow默認(rèn)會創(chuàng)建一張計算圖。所以上面代碼中的前兩行,可以省略。默認(rèn)情況下,計算圖是空的。

在執(zhí)行完img = tf.constant(1.0, shape=[1,5,5,3])以后,計算圖中生成了一個node,一個node結(jié)點由name, op, input, attrs組成,即結(jié)點名稱、操作、輸入以及一系列的屬性(類型、形狀、值)等組成,計算圖就是由這樣一個個的node組成的。對于tf.constant()函數(shù),只會生成一個node,但對于有的函數(shù),如tf.Variable(initializer, name)(注意其第一個參數(shù)是初始化器)就會生成多個node結(jié)點(后面會講到)。

那么執(zhí)行完img = tf.constant(1.0, shape=[1,5,5,3])后,計算圖中就多一個node結(jié)點。(因為每個node的屬性很多,我只表示name,op,input屬性)

繼續(xù)添加代碼:

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])

代碼執(zhí)行后的計算圖如下:

需要注意的是,如果沒有對結(jié)點進行命名,Tensorflow自動會將其命名為:Const、Const_1、const_2......。其他類型的結(jié)點類同。

現(xiàn)在,我們添加一個變量:

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])
kernel = tf.Variable(k)

該變量用一個常量作為初始化器。我們先看一下計算圖:

如圖所示:
執(zhí)行完tf.Variable()函數(shù)后,一共產(chǎn)生了三個結(jié)點:

  • Variable:變量維護(不存放實際的值)
  • Variable/Assign:變量分配
  • Variable/read:變量使用

圖中只是完成了操作的定義,但并沒有執(zhí)行操作(如Variable/Assign結(jié)點的Assign操作,所以,此時候變量依然不可以使用,這就是為什么要在會話中初始化的原因)。

我們繼續(xù)添加代碼:

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])
kernel = tf.Variable(k)
y = tf.nn.conv2d(img, kernel, strides=[1,2,2,1], padding="SAME")

得到的計算圖如下:

可以看出,變量讀取是通過Variable/read來進行的。

如果在這里我們直接開啟會話,并執(zhí)行計算圖中的卷積操作,系統(tǒng)就會報錯。

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])
kernel = tf.Variable(k)
y2 = tf.nn.conv2d(img, kernel, strides=[1,2,2,1], padding="SAME")
with tf.Session() as sess:
  sess.run(y2)

這段代碼錯誤的原因在于,變量并沒有初始化就被使用,而從圖中清晰的可以看到,直接執(zhí)行卷積,是回溯不到變量的值(Const_1)的(箭頭方向)。

所以,在執(zhí)行之前,要進行初始化,代碼如下:

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])
kernel = tf.Variable(k)
y2 = tf.nn.conv2d(img, kernel, strides=[1,2,2,1], padding="SAME")
init = tf.global_variables_initializer()

執(zhí)行完tf.global_variables_initializer()函數(shù)以后,計算圖如下:

tf.global_variables_initializer()產(chǎn)生了一個名為init的node,該結(jié)點將所有的Variable/Assign結(jié)點作為輸入,以達到對整張計算圖中的變量進行初始化。
所以,在開啟會話后,執(zhí)行的第一步操作,就是變量初始化(當(dāng)然變量初始化的方式有很多種,我們也可以顯示調(diào)用tf.assign()來完成對單個結(jié)點的初始化)。
完整代碼如下:

img = tf.constant(1.0, shape=[1,5,5,3])
k = tf.constant(1.0, shape=[3,3,3,1])
kernel = tf.Variable(k)
y2 = tf.nn.conv2d(img, kernel, strides=[1,2,2,1], padding="SAME")
init = tf.global_variables_initializer()
with tf.Session() as sess:
  sess.run(init)
  # do someting....

會話

在上述代碼中,我已經(jīng)使用會話(tf.session())來執(zhí)行計算圖了。在tf.session()中,我們重點掌握無所不能的sess.run()。

一個session()中包含了Operation被執(zhí)行,以及Tensor被evaluated的環(huán)境。

tf.Session().run()函數(shù)的定義:

run(
  fetches,
  feed_dict=None,
  options=None,
  run_metadata=None
)

tf.Session().run()函數(shù)的功能為:執(zhí)行fetches參數(shù)所提供的operation操作或計算其所提供的Tensor。

run()函數(shù)每執(zhí)行一步,都會執(zhí)行與fetches有關(guān)的圖中的所有結(jié)點的計算,以完成fetches中的任務(wù)。其中,feed_dict提供了部分?jǐn)?shù)據(jù)輸入的功能。(和tf.Placeholder()搭配使用,很舒服)

參數(shù)說明:

  • fetches:可以是圖中的一個結(jié)點,也可以是一個List或者字典,此時候返回值與fetches格式一致;該參數(shù)還可以是一個Operation,此時候返回值為None。
  • feed_dict:字典格式。給模型輸入其計算過程中所需要的值。

當(dāng)我們把模型的計算圖構(gòu)建好以后,就可以利用會話來進行執(zhí)行訓(xùn)練了。

在明白了計算圖是如何構(gòu)建的,以及如何被會話正確的執(zhí)行以后,我們就可以愉快的開始Tensorflow之旅啦。

參考鏈接

https://jacobbuckman.com/

https://danijar.com/what-is-a-tensorflow-session/

http://looop.cn/?p=3365

到此這篇關(guān)于Tensorflow中的圖(tf.Graph)和會話(tf.Session)的實現(xiàn)的文章就介紹到這了,更多相關(guān)Tensorflow tf.Graph tf.Session內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python爬取網(wǎng)頁版QQ空間,生成各類圖表

    python爬取網(wǎng)頁版QQ空間,生成各類圖表

    最近python課程學(xué)完了,琢磨著用python點什么東西,經(jīng)過一番搜索,盯上了QQ空間,本文主要講述了如何爬取網(wǎng)頁版QQ空間,并生成詞云圖、柱狀圖、折線圖、餅圖的各種示例代碼
    2021-06-06
  • 利用python求相鄰數(shù)的方法示例

    利用python求相鄰數(shù)的方法示例

    相鄰數(shù)是數(shù)學(xué)名詞,意思是在從小到大依次排列的自然數(shù)中,一個數(shù)前面和后面相互鄰近的兩個數(shù)就是該數(shù)的相鄰數(shù)。下面這篇文章主要給大家介紹了利用python求相鄰數(shù)的方法示例,需要的朋友可以參考下。
    2017-08-08
  • 樸素貝葉斯分類算法原理與Python實現(xiàn)與使用方法案例

    樸素貝葉斯分類算法原理與Python實現(xiàn)與使用方法案例

    這篇文章主要介紹了樸素貝葉斯分類算法原理與Python實現(xiàn)與使用方法,結(jié)合具體實例形式分析了樸素貝葉斯分類算法的概念、原理、實現(xiàn)流程與相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Python日期操作學(xué)習(xí)筆記

    Python日期操作學(xué)習(xí)筆記

    字符串是使用靜態(tài)的方式進行存儲,只能讀而不能直接修改字符內(nèi)容。特別將一堆對字符串并在一起的時候,雖然可以直接相加,聽說這樣的速度奇慢,只有用其它函數(shù)的方式進行,好在也不太麻煩。
    2008-10-10
  • python實現(xiàn)雙人五子棋(終端版)

    python實現(xiàn)雙人五子棋(終端版)

    這篇文章主要為大家詳細介紹了python實現(xiàn)終端版的雙人五子棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • python中Array和DataFrame相互轉(zhuǎn)換的實例講解

    python中Array和DataFrame相互轉(zhuǎn)換的實例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于python中Array和DataFrame相互轉(zhuǎn)換的實例講解內(nèi)容,對此有需要的朋友們可以學(xué)參考下。
    2021-02-02
  • Python模塊文件結(jié)構(gòu)代碼詳解

    Python模塊文件結(jié)構(gòu)代碼詳解

    這篇文章主要介紹了Python模塊文件結(jié)構(gòu)代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Python 玩轉(zhuǎn)圖像格式轉(zhuǎn)換操作

    Python 玩轉(zhuǎn)圖像格式轉(zhuǎn)換操作

    這篇文章主要介紹了Python 玩轉(zhuǎn)圖像格式轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • PyTorch實現(xiàn)手寫數(shù)字識別的示例代碼

    PyTorch實現(xiàn)手寫數(shù)字識別的示例代碼

    本文主要介紹了PyTorch實現(xiàn)手寫數(shù)字識別的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>
    2022-05-05
  • windows python3安裝Jupyter Notebooks教程

    windows python3安裝Jupyter Notebooks教程

    這篇文章主要介紹了windows python3安裝Jupyter Notebooks教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論