面向機器智慧的TensorFlow實戰2:TensorFlow基礎

CopperDong發表於2018-05-24

1、資料流圖簡介

      兩個基礎構件:節點和邊

      構建第一個TensorFlow資料流圖:

>>> import tensorflow as tf
>>> a = tf.constant(5, name="input_a")
>>> b = tf.constant(3, name="input_b")
>>> c = tf.multiply(a, b, name="mul_c")
>>> d = tf.add(a, b, name="add_d")
>>> e = tf.add(c, d, name="add_e")
>>> sess = tf.Session()
>>> sess.run(e)
# 儲存資料流圖的資料和概括統計量
>>> writer = tf.summary.FileWriter('./my_graph', sess.graph)  
$ tensorboard --logdir="my_graph"

     張量:1D張量等價於向量,2D張量等價於矩陣,N維張量

a = tf.constant([5,3], name="input_a")
b = tf.reduce_prod(a, name="prod_b")  # 累乘
c = tf.reduce_sum(a, name="sum_c")    # 累加
d = tf.add(c, d, name="add_d")


     NumPy陣列:TensorFlow資料型別是基於NumPy的資料型別的。字串資料型別



      Graph物件:在大多數TensorFlow程式中,只使用預設資料流圖就足夠了。然而,如果需要定義多個相互之間不存在依賴關係的模型,則建立多個Graph物件十分有用。

      Session物件:Session類負責資料流圖的執行,tf.Session接收3個可選引數:

.target指定了所要使用的執行引擎。

.graph引數指定了將要在Session物件中載入的Graph物件。

.config引數允許使用者指定配置Session物件所需的選項,如限制CPU或GPU的使用數目,為資料流圖設定優化引數及日誌選項等。

   session.run()接收一個引數fetches,以及其他三個可選引數:feed_dict、options和run_metadata。

     利用佔位節點新增輸入:tf.placeholder Op可建立佔位符。

# 建立一個長度為2,資料型別為int32的佔位向量
a = tf.placeholder(tf.int32, shape=[2], name="my_input")
b = tf.reduce_prod(a, name="prod_b")
c = tf.reduce_sum(a, name="sum_c")
# 完成資料留圖的定義
d = tf.add(b, c, name="add_d")

     Variable物件:Tensor物件和Op物件都是不可變的,但機器學習任務的本質決定了需要一種機制儲存隨事件變化的值。藉助TensorFlow中的Variable物件,便可達到這個目的。Variable物件包含了在對Session.run()多次呼叫中可持久的可變張量值。

     通過名稱作用域組織資料流圖:現實世界中的模型往往會包含幾十或上百個節點,以及數以百萬計的引數。為使這種級別的複雜性可控,TensorFlow當前提供了一種幫助使用者組織資料流圖的機制---名稱作用域(name scope)

     綜合例項

import tensorflow as tf
tf.merge_all_summaries = tf.summary.merge_all
tf.train.SummaryWriter = tf.summary.FileWriter
graph = tf.Graph()
with graph.as_default():
    with tf.name_scope("variables"):
        # 用於追蹤模型的執行次數
        global_step = tf.Variable(0, dtype=tf.int32, trainable=False, name="global_step")
        # 追蹤該模型的所有輸出隨時間的累加和
        total_output= tf.Variable(0.0, dtype=tf.float32, trainable=False, name="total_output")
        
    with tf.name_scope("transformation"):
        # 獨立的輸入層
        with tf.name_scope("input"):
            a = tf.placeholder(tf.float32, shape=[None], name="input_placeholder_a")
        # 獨立的中間層
        with tf.name_scope("intermediate_layer"):
            b = tf.reduce_prod(a, name="product_b")
            c = tf.reduce_sum(a, name="sum_c")
        # 獨立的輸出層
        with tf.name_scope("output"):
            output = tf.add(b, c, name="output")
            
    with tf.name_scope("update"):
        # 用最新的輸出更新
        update_total = total_output.assign_add(output)
        # global_step增1
        increment_step = global_step.assign_add(1)
        
    with tf.name_scope("summaries"):
        avg = tf.div(update_total, tf.cast(increment_step, tf.float32), name="average")
        # 為輸出節點建立彙總資料
        tf.summary.scalar(b'Output', output)
        tf.summary.scalar(b'Sum of outputs over time', update_total)
        tf.summary.scalar(b'Average of outputs over time', avg)
        
    with tf.name_scope("global_ops"):
        init = tf.initialize_all_variables()
        merged_summaries = tf.merge_all_summaries()
        
sess = tf.Session(graph=graph)
writer = tf.summary.FileWriter("./improved_graph", graph)
sess.run(init)
  
def run_graph(input_tensor):
    feed_dict = {a: input_tensor}
    _, step, summary = sess.run([output, increment_step, merged_summaries], feed_dict=feed_dict)
    writer.add_summary(summary, global_step=step)
    
run_graph([2,8])
run_graph([3,1,3,3])
run_graph([8])
run_graph([1,2,3])
run_graph([11,4])
run_graph([4,1])
run_graph([7,3,1])
run_graph([6,3])
run_graph([0,2])
run_graph([4,5,6])

writer.flush()
writer.close()
sess.close()


相關文章