tensorflow(一):基礎

一、張量

1、張量的概念

      在TensorFlow中,所有的數據都通過張量的形式來表示。從功能的角度,張量可以簡單理解為多維數組,零階張量表示標量(scalar),也就是一個數;一階張量為向量(vector),也就是一維數組;n階張量可以理解為一個n維數組。需要注意的是,張量並沒有真正保存數字,它保存的是計算過程

2、張量的屬性

    以張量Tensor(“Add:0”, shape=(), dtype=float32) 為例:

(1)名字(Name)

    屬性的第一項就是名字,一般形式為「node:src_output」,node表示節點名稱,src_output 來自節點的第幾個輸出。

(2)形狀(Shape)

    屬性的第二項是維度,張量的維度可以用三個術語來描述:階(Rank)、形狀(Shape)、維數(Dimension Number)。一般表示形式如表1所示。

形狀

維數

例子

0

()

0-D

4

1

(D0)

1-D

[2,3,5]

2

(D0,D1)

2-D

[[2,3],[3,4]]

3

(D0,D1,D2)

3-D

[[[7],[3]],[[2],[4]]]

N

(D0,D1,…,Dn-1)

N-D

形為(D0,D1,…,Dn-1)的張量

表3-1 張量的維度表示

(3)類型(Type)

    每一個張量會有一個唯一的類型,TensorFlow在進行運算的時候會對參與運算的所有張量進行類型的檢查,發現類型不匹配時會報錯.

    TensorFlow支援14種不同的類型:

    實數 tf.float32, tf.float64

    整數 tf.int8, tf.int16, tf.int32, tf.int64, tf.uint8

    布爾 tf.bool

    複數 tf.complex64, tf.complex128

    默認類型:不帶小數點的數會被默認為int32,帶小數點的會被默認為float32。

二、常量與變數

1、常量 Constant

    常量指在運行過程中不會改變的值,在TensorFlow中無需進行初始化操作。

    創建語句:

    Constant_name = tf.constant(value)

    常量在TensorFlow中一般被用於設置訓練步數、訓練步長和訓練輪數等超參數,此類參數在程式執行過程中一般不需要被改變,所以一般被設置為常量。

2、變數 Variable

    變數是指在運行過程中會改變的值,在TensorFlow中需要進行初始化操作。

    創建語句:

    name_variable = tf.Variable(value, name)

    注意:V是大寫字母

    個別變數初始化:

    init_op = name_variable.initializer()

    使用TensorFlow編寫一個簡單的神經網路一般會用到幾十個變數,若編寫大型的神經網路,往往會使用到成千上萬個變數。若每個變數定義完都要初始化未免太過繁瑣,所以TensorFlow有提供所有變數初始化的語句。 所有變數初始化:

    init_op = tf.global_variables_initializer()

# 一個簡單計算圖
node1 = tf.constant(3.0,tf.float32,name="node1")
node2 = tf.constant(4.0,tf.float32,name="node2")
node3 = tf.add(node1, node2)
print(node3)
​
# 建立對話並顯示運行結果
sess = tf.Session()
​
print("運行sess.run(node1)的結果:", sess.run(node1))
# 更新變數並返回計算結果
print("運行sess.run(node3)的結果:", sess.run(node3))
​
# 關閉session
sess.close()

三、會話

# 定義計算圖
tens1 = tf.constant([1,2,3])
​
# 創建一個會話
sess = tf.Session()
try:
#使用這個創建好的會話來得到關心的運算的結果。比如可以調用 sess.run(result)
#來得到張量result的取值
    print(sess.run(tens1))
except:
    print("Exception!")
finally:
#關閉會話使得本次運行中使用到的資源可以被釋放
    sess.close()
node1 = tf.constant(3.0,tf.float32,name="node1")
node2 = tf.constant(4.0,tf.float32,name="node2")
result = tf.add(node1, node2)
​
#創建一個會話,並通過Python中的上下文管理器來管理這個會話
with tf.Session() as sess:
    #使用這創建好的會話來計算關心的結果
    print(sess.run(result))
​
# 不需要再調用 Session.close() 函數來關閉會話
# 當上下文退出時會話關閉和資源釋放也自動完成了

四、變數的賦值

    與傳統的編程不同,在TensorFlow中變數定義和初始化後,一般無需人工進行賦值,系統會根據演算法模型,訓練優化過程中自動調整變數對應的數值。這部分的內容在後面我們使用TensorFlow實現機器學習的一些演算法的時候會更加有體會。

    TensorFlow中的變數可以通過設置trainable參數來確定在訓練的時候是否更新其值,如前面提到訓練輪數一般設置為常量,但如果設置為變數,可以設置trainable=False,同樣可以達到程式執行過程中不改變其值的目的。前面提到的訓練輪數可以用以下語句進行變數賦值:

    epoch = tf.Variable(0,name=’epoch’,trainable=False)。

    但是當TensorFlow中有特殊情況需要對變數進行人工更新,也是可以用變數的更新語句的,例如:

    update_op = tf.assign(variable_to_be_updated, new_value)。

import tensorflow as tf
​
value = tf.Variable(0, name="value")
one = tf.constant(1)
new_value = tf.add(value, one)
update_value = tf.assign(value, new_value)
​
init = tf.global_variables_initializer()
​
with tf.Session() as sess:
    sess.run(init)
    for _ in range(10):
        sess.run(update_value)
        print(sess.run(value))

五、佔位符

    前文提到,TensorFlow中的Variable變數類型,在定義時需要初始化,但有些變數定義時並不知道其數值,只有當真正開始運行程式時,才由外部輸入,比如訓練數據,這時候需要用到佔位符

    佔位符,是TensorFlow中特有的一種數據結構,類似動態變數,函數的參數、或者C語言或者Python語言中格式化輸出時的「%」佔位符。

    TensorFlow中的佔位符雖然定義完之後不需要對其值進行初始化,但是需要確定其數據的Type和Shape。佔位符的函數介面如下:

    tf.placeholder(dtype, shape=None, name=None)

    1、Feed提交數據

    在TensorFlow中如果構建了一個包含placeholder操作的計算圖,在程式執行當在session中調用run方法時,placeholder佔用的變數必須通過feed_dict參數傳遞進去,否則報錯。圖12提供了一個Feed的樣例。

    注:多個操作可以通過一次Feed完成執行

    2、 Fetch提取數據

    會話運行完成之後,如果我們想查看會話運行的結果,就需要使用fetch來實現,feed、fetch一般搭配起來使用