1. 程式人生 > >TensorFlow中的計算圖學習

TensorFlow中的計算圖學習

簡介:

        官網上對TensorFlow的介紹是: 一個使用資料流圖(data flow graphs)技術來進行數值計算的開源軟體庫 

   (有點類似於這樣 :)

    

        TensorFlow包含構建資料流圖與計算資料流圖等基本步驟,圖中的節點表示數學操作,圖中連結各節點的邊表示多維陣列,即:tensors(張量)。 張量是TensorFlow最核心的元件,所有運算和優化都是基於張量進行的。張量是基於向量和矩陣的推廣,可以將標量看為零階張量,向量看做一階張量,矩陣看做二階張量。

 

tensorflow程式一般分為兩個階段:

  •   1、定義計算圖所有的計算

  •   2、在session中執行計算

在這幾行程式碼中完全體現了這兩項操作

(      還額外包括了  :

  • 將資料表示為tensors;

  • 使用Variables來保持狀態資訊;

  • 分別使用feeds和fetches來填充資料和抓取任意的操作結果;   )


import tensorflow as tf
a =tf.placeholder("float")
b =tf.placeholder("float")
y = tf.multiply(a,b)
sess = tf.Session()
print(sess.run(y, feed_dict={a: 3, b: 3}))

--------------------- 
轉載於 作者:Jasen_Fu 

張量的階數:

                  TensorFlow用張量表示所有的資料,張量可看成一個n維的陣列或列表,在圖中的節點之間流通。張量的維數稱為階,在另一片文中有相應的一些介紹。

 

 

計算圖

在tensorflow程式中,系統會自動給引數一個預設的計算圖,可以通過tf.get_default_graph()函式獲取。

import tensorflow as tf

x = tf.constant(10)
y = tf.constant(15)
print(x.graph)


結果為:
<tensorflow.python.framework.ops.Graph object at 0x000001AE613E8E80>

tensorflow可以通過tf.Graph函式生成新的計算圖。不同計算圖上的張量和運算都不會共享

g1=tf.Graph()
with g1.as_default():
    # 在計算圖g1中定義變數'v',並設定初始值為0。
    v=tf.get_variable('v',initializer=tf.zeros_initializer()(shape = [1]))
    
g2=tf.Graph()
with g2.as_default():
    # 在計算圖g2中定義變數'v',並設定初始值微1。
    v=tf.get_variable('v',initializer=tf.ones_initializer()(shape = [1]))

# 在計算圖g1中讀取變數'v'的取值
with tf.Session(graph=g1) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope('',reuse=True):
        # 在計算圖g1中,變數'v'的取值應該為0,下一行程式碼會輸出[0.]。
        print(sess.run(tf.get_variable('v')))

# 在計算圖g2中讀取變數'v'的取值
with tf.Session(graph=g2) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope('',reuse=True):
        # 在計算圖g2中,變數'v'的取值應該為1,下一行程式碼會輸出[1.]。
        print(sess.run(tf.get_variable('v')))

############# 程式碼借鑑於https://www.cnblogs.com/hypnus-ly/p/8040951.html 這位朋友的部落格#######

tensorflow中的計算圖不僅可以用來隔離張量和計算,它還提供了管理張量和計算的機制,具體的可以到上面這位朋友的部落格中看。

 

import tensorflow as tf

x = tf.constant(10)
y = tf.constant(15)
print(x+y)



結果:   Tensor("add_1:0", shape=(), dtype=int32)

我們觀察一下這裡的輸出資訊,一共是三個,代表了張量在儲存時候的三種屬性:

                                                                         名字(name)、維度(shape)和型別(type)

其中,name屬性以“node:src_output”的形式表示,node表示節點的名稱,src_output表示當前張量來自節點的第幾個輸出。

還可以通過result.get_shape函式來獲取結果張量的維度資訊。

 

tensorflow中session的講解

建立session的三種方式:

# 1、 建立一個會話
with tf.Session() as sess:
    print(sess.run(result))
# tensorflow中需要手動指定預設會話,當該會話指定後,可以通過tf.Tensor.eval函式來計算一個張量的取值。
# 2、 建立一個預設的會話
sess=tf.Session()
with sess.as_default():   # 需要在這裡先指定一個會話,也就是指定一個sess的名稱(有點類似於namespace吧)
    print(result.eval())
# 3、 建立一個會話
sess=tf.Session()
# 下面兩個命令等價
print(sess.run(result))
print(result.eval(session=sess))
# 在互動式環境下,使用設定預設會話的方法來獲取張量的取值更加方便,tensorflow提供了一種在互動式環境下直接構建
# 預設會話的函式,tf.InteractiveSession。該函式會自動將生成的會話註冊為預設會話。
sess= tf.InteractiveSession()
print(result.eval())
sess.close()