tensorflow(一):基礎

1、張量

一、張量的概念node

      在TensorFlow中,全部的數據都經過張量的形式來表示。從功能的角度,張量能夠簡單理解爲多維數組,零階張量表示標量(scalar),也就是一個數;一階張量爲向量(vector),也就是一維數組;n階張量能夠理解爲一個n維數組。須要注意的是,張量並無真正保存數字,它保存的是計算過程算法

二、張量的屬性編程

    以張量Tensor("Add:0", shape=(), dtype=float32) 爲例:數組

(1)名字(Name)瀏覽器

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

(2)形狀(Shape)session

    屬性的第二項是維度,張量的維度能夠用三個術語來描述:階(Rank)、形狀(Shape)、維數(Dimension Number)。通常表示形式如表1所示。數據結構

app

形狀dom

維數

例子

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。

2、常量與變量

一、常量 Constant

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

    建立語句:

    Constant_name = tf.constant(value)

    常量在TensorFlow中通常被用於設置訓練步數、訓練步長和訓練輪數等超參數,此類參數在程序執行過程當中通常不須要被改變,因此通常被設置爲常量。

二、變量 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()

3、會話

# 定義計算圖
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() 函數來關閉會話
# 當上下文退出時會話關閉和資源釋放也自動完成了

4、變量的賦值

    與傳統的編程不一樣,在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))

5、佔位符

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

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

    TensorFlow中的佔位符雖然定義完以後不須要對其值進行初始化,可是須要肯定其數據的Type和Shape。佔位符的函數接口以下:

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

    一、Feed提交數據

    在TensorFlow中若是構建了一個包含placeholder操做的計算圖,在程序執行當在session中調用run方法時,placeholder佔用的變量必須經過feed_dict參數傳遞進去,不然報錯。圖12提供了一個Feed的樣例。

    注:多個操做能夠經過一次Feed完成執行

    二、 Fetch提取數據

    會話運行完成以後,若是咱們想查看會話運行的結果,就須要使用fetch來實現,feed、fetch通常搭配起來使用

相關文章
相關標籤/搜索