TensorFlow基礎篇

Tensor(張量)意味着N維數組,Flow(流)意味着基於數據流圖的計算。TensorFlow的運行機制屬於「定義」和「運行」相分離。模型的構建只是至關於定義了一個圖結構(表明一個計算任務),圖中有多個操做節點,每一個節點能夠有一個或多個tensor做爲輸入,也會輸出1個或多個tensor,只有經過session啓動一個會話,並經過feed機制把數據填充進去,數據以tensor的形式進行流動,整個計算任務才能被啓動。html

with關鍵字在程序結束以後會自動關閉python

TensorFlow中圖的理解git

一個操做對象(Operation)是TensorFlow圖中的一個節點, 能夠接收0個或者多個輸入Tensor, 而且能夠輸出0個或者多個Tensor,Operation對象是經過op構造函數(如tf.matmul())建立的。github

具體參考:數組

https://www.jianshu.com/p/b547c163e202session

https://blog.csdn.net/sinat_26745777/article/details/84350681框架

和圖相關的經常使用函數函數

https://blog.csdn.net/lenbow/article/details/52181159學習

class tf.Graph  tensorflow中的計算以圖數據流的方式表示,一個圖包含一系列表示計算單元的操做對象以及在圖中流動的數據單元以tensor對象表現url

tf.Graph()    創建一個空圖

tf.Graph.as_default()    一個將某圖設置爲默認圖,並返回一個上下文管理器,若是不顯式添加一個默認圖,系統會自動設置一個全局的默認圖。所設置的默認圖,在模塊範圍內所定義的節點都將默認加入默認圖中

tf.Graph.as_graph_def(from_version=None, add_shapes=False)    返回一個圖的序列化的GraphDef表示,序列化的GraphDef能夠導入至另外一個圖中(使用 import_graph_def())    #在把圖進行pb封裝時會用到

tf.reset_default_graph()  #重置默認圖,加載圖之間應該先重置默認圖,由於不重置在封裝多個圖時可能會加載別人的圖

tf.Graph.get_operation_by_name(name)   根據名稱返回操做節點       tf.Graph.get_operation_by_name(name).output[0]  得到相應名稱操做節點其輸出tensor中爲0的tensor

tf.Graph.get_tensor_by_name(name)  根據名稱返回tensor數據

因此訪問計算圖中的V1節點,就只能使用tf.get_default_graph().get_tensor_by_name("v1:0")的方式。

不少人可能並不理解這個:0,這是一個operation的輸出。也就是說變量節點的輸出只有一個,因此用0表示引用計算圖中這個變量節點的輸出tensor。

tf.Graph.get_operations()   返回圖中的操做節點列表

加載持久化模型的方式

結合:http://www.mamicode.com/info-detail-2424278.html

第一種:經過saver加載saver = tf.train.Saver()   saver.restore

經過這種方式加載須要注意

1)程序前面得有 Variable 供 save or restore 纔不報錯不然會提示沒有可保存的變量

2)這種方式只是持久化模型中變量的值加載到當前代碼計算圖中的變量中去。屬於當前代碼計算圖已經定義,所以還必須在加載以前建立模型,變量是當前代碼計算圖中變量集合的一個子集,必須是一種嚴格包含的關係。

第二種:經過import_meta_graph

這種方式徹底不容許當前代碼計算圖已經定義的變量節點和要加載的持久化模型中的節點存在衝突,由於它不只加載參數還會加載整個圖結構。

第三種:使用pb文件的方式。

即便持久化模型中的變量節點和當前代碼計算圖中定義的變量節點發生衝突,也沒有問題,沒有任何關係。由於pb文件的方式加載進來的計算圖,會所有加上import/前綴。也就是說,從命名空間上就隔開了這種衝突。因此,使用別人的模型,最好的方式就是用pb文件。由於不會有衝突的可能!

可是,有一個弊端就是,import命名空間下的變量不能參與到當前的訓練

同時,你使用v1=tf.get_variable(name="v1",shape=[1])方式,會在當前代碼的計算圖中生成一個新的變量節點V1_1,並不是加載的持久化模型中的變量節點V1。此時,就會出現函數功能失效。也就是,你但願調用get_variable函數使得:python的變量v1和計算圖中的變量節點v1是綁定的,可是狀況並不是如此,綁定的是變量節點v1_1。

因此訪問計算圖中的V1節點,就只能使用tf.get_default_graph().get_tensor_by_name("v1:0")的方式。

 

封裝成pb文件的好處:

一、它具備語言獨立性,可獨立運行,封閉的序列化格式,任何語言均可以解析它,它容許其餘語言和深度學習框架讀取、繼續訓練和遷移 TensorFlow 的模型。

二、實現了建立模型與使用模型的解耦。

三、保存爲 PB 文件時候,模型的變量都會變成固定的,致使模型的大小會大大減少。

四、避免形成命名的衝突。

相關文章
相關標籤/搜索