本學期的TensorFlow這門課,已經開課好長時間了。下面就把之前的學習總結一下。
一、Tensorflow的基礎框架。
1、系統框架
雖然Tensorflow的框架的版本不斷的進行更新,但是系統架構並沒有發生根本性的變化。它以不同的功能需求進行分層處理,以統一接口屏蔽具體實現,從而集中各自的關注層次,更好的提升Tensorflow的適用性,系統架構如下:
從上圖可以明顯的看出:Tensorflow系統框架分爲三層,從上而下依次是應用層、接口層、核心層。
2、TensorFlow的系統的六個特性
TensorFlow的系統架構具有許多特性:
- 高度靈活性
- 真正的可移植性
- 連接研究與產品
- 自動微分
- 多語言選擇
- 最大化性能
3、TensorFlow的編程特點
TensorFlow除了以數據流爲核心外,在編程實現過程中還具備以下的兩大特點:
-
將圖的定義和圖的運行完全分開
使用Tensorflow進行編程與使用Python進行編程有明顯的區別。在進行Python進行編程時,只要定義了相關變量以及運算,在程序運行時就會直接執行相關運算得到結果。在Tensorflow中需要預先定義各種變量,建立相關數據流圖,在數據流圖中定義各種變量之間的關係,以此完成圖的定義。此時,圖只是運算規則,沒有任何實際數據,需要把運算的輸入數據放進去後,纔會形成輸出值。 -
圖的計算在會話中執行
Tensorflow的相關計算在圖中進行定義,而圖的具體運行環境在會話(Session)中。只有開啓會話後,纔可以使用相關數據去填充節點,這樣才能開始計算;關閉會話後,就不能進行計算。
下面是Python與TensorFlow的編程思路對比,來實現簡單的一些計算:
在python中:
a=3
b=4
c=5
y=a*b+c
print(y)
則會輸出結果:17
在TensorFlow中,我們也輸入類似的代碼:
import tensorflow as tf
a=3
b=4
c=5
y=tf.add(a*b,c)
print(y)
則會輸出: Tensor(“Add:0”, shape=(), dtype=int32)
可以明顯的看到,並沒有輸出運算的結果,而是輸出了一個Tensor,這是因爲我們僅僅完成了圖的定義,而沒有實現具體的運算。
下面我們就更改上述的代碼,實現運算,就需要滿足Tensorflow中計算的幾個階段,首先進行定義計算圖,然後創建會話,最後則完成計算。
import tensorflow as tf
#創建圖
a=tf.constant(3,tf.float32) #定義常量
b=tf.constant(4,tf.float32)
c=tf.constant(5,tf.float32)
y=tf.add(a*b,c) #定義計算公式
print(y)
sess=tf.Session() #創建會話
print(sess.run(y)) #計算
sess.close() #關閉會話
運行結果如下:
Tensor("Add:0", shape=(), dtype=float32)
17.0
可以看出,只有在會話中完成計算後纔會輸出計算結果17。
TensorFlow採用這樣的設計主要因爲他是針對機器學習的框架,消耗最多的是對輸入數據的訓練。
二、TensorFlow的基本概念
1、Tensor
Tensor是張量,是最基本的概念,也是TensorFlow中最主要的數據結構。張量用於在計算圖中進行數據的傳遞,但是創建了一個張量後,不會立即在計算圖中增加該張量,而需要將該張量賦值給一個變量或者佔位符,之後纔會將該張量增加到計算圖中。
張量,可理解爲一個 n 維矩陣,所有類型的數據,包括標量、矢量和矩陣等都是特殊類型的張量。
張量的生成方式有很多種,例如固定張量、相似張量、序列張量、分佈張量等。
import tensorflow as tf
#Tensor
row=3.0
col=4.0
zero_tsr= tf.zeros([row,col]) #值爲0,指定維度的張量
ones_tsr=tf.ones([row,col]) #值爲1,指定維度的張量
filled_tsr=tf.fill([3,4],2.0) #指定填充數值2.0 ,指定維度的張量
constant_tsr=tf.constant([1,2,3]) #已知常數的張量
zeros_similar=tf.zeros_like(constant_tsr) #所有元素爲0,與constant_tsr類型一致的張量
ones_similar=tf.ones_like(constant_tsr) #所有元素爲1,與constant_tsr類型一致的張量
liner_tsr=tf.linspace(start=0.0,stop=2.0,num=3) #創建指定的區間,等間距的張量
integer_seq_str=tf.range(start=0,limit=5,delta=1) #創建指定的區域,間隔的張量
randunif_tsr=tf.random_uniform([3,4],minval=0,maxval=2)#創建均勻分佈隨機數的張量
randnorm_tsr=tf.random_normal([3,4],mean=0.0,stddev=1.0)#創建正態分佈隨機數的張量
runcnorm_tsr=tf.truncated_normal([3,4],mean=0.0,stddev=1.0)#創建指定邊界的正態分佈張量
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
#Tensor
print ('zero_tsr is ',sess.run(zero_tsr))
print ('ones_tsr is ',sess.run(ones_tsr))
print ('filled_tsr is ',sess.run(filled_tsr))
print ('constant_tsr is ',sess.run(constant_tsr))
print ('zeros_similar is ',sess.run(zeros_similar))
print ('ones_similar is ',sess.run(ones_similar))
print ('liner_tsr is ',sess.run(liner_tsr))
print ('integer_seq_str is ',sess.run(integer_seq_str))
print ('randunif_tsr is ',sess.run(randunif_tsr))
print ('randnorm_tsr is ',sess.run(randnorm_tsr))
print ('runcnorm_tsr is ',sess.run(runcnorm_tsr))
sess.close()
輸出結果:
zero_tsr is [[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
ones_tsr is [[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
filled_tsr is [[2. 2. 2. 2.]
[2. 2. 2. 2.]
[2. 2. 2. 2.]]
constant_tsr is [1 2 3]
zeros_similar is [0 0 0]
ones_similar is [1 1 1]
liner_tsr is [0. 1. 2.]
integer_seq_str is [0 1 2 3 4]
randunif_tsr is [[0.92969847 0.7200849 1.4162304 1.2510674 ]
[0.97165823 1.45502 1.5120289 0.9996681 ]
[0.96171427 0.8367257 0.731313 1.85327 ]]
randnorm_tsr is [[-0.670491 1.5340202 0.47463468 -1.9473785 ]
[-1.1878501 -0.521639 0.10082857 -2.3056 ]
[ 0.51349676 0.6248353 0.53046846 0.24368662]]
runcnorm_tsr is [[ 1.1717324 -0.12139019 0.97365093 0.28850073]
[ 0.96101403 -0.46031672 -0.65009755 1.5967586 ]
[-1.8578918 0.15960255 -0.38491356 1.5632377 ]]
2、Variable
Variable即變量、一般用來表示圖中的各個計算參數,包括矩陣和向量,他在計算圖中有固定的位置。一般我們在TensorFlow中通過調整這些變量的狀態來優化機器學習算法。
創建變量使用函數tf.Variable(),通過輸入一個張量,返回一個變量。變量聲明後需要進行初始化才能使用。通過打印張量和變量,可對比他們的不同之處。
import tensorflow as tf
tensor=tf.zeros([1,2])
m_var=tf.Variable(tensor)
init_op=tf.global_variables_initializer()
sess=tf.Session()
with tf.Session() as sess:
print("tensor is",sess.run(tensor))
sess.run(init_op)
print("m_var is",sess.run(m_var))
輸出結果:
tensor is [[0. 0.]]
m_var is [[0. 0.]]
3、Placeholder
Tensorflow佔位符,用於表示輸入輸出數據的格式,允許傳入指定類型和形狀的數據。佔位符僅僅聲明瞭數據位置,告訴系統這裏有一個值、向量或者矩陣、現在還沒法給出具體值。佔位符通過會話的feed_dict參數獲取數據,在計算圖運行時使用獲取的數據進相應的計算,計算完畢後獲取的數據就會消失。
import tensorflow as tf
#placeholder
x=tf.placeholder(tf.float32)
y=tf.placeholder(tf.float32)
z=tf.add(x,y)
x_data=[1.0,2.0]
y_data=[10.0,11.0]
init_op = tf.global_variables_initializer()
sess = tf.Session()
with tf.Session() as sess:
print(sess.run( [z],feed_dict={x:x_data,y:y_data} ))
運行結果:
[array([11., 13.], dtype=float32)]
4、Session
Session是會話,是TensorFlow中計算圖的具體執行者,與圖進行實際的交互。一個會話中可以有多個圖,會話的目的是將訓練數據添加到圖中進行訓練,當然也可以進行修改圖的結構。
下面進行介紹會話的兩種使用方式:
- 明確的調用會話的生成函數和關閉函數。
sess=tf.Session()
sess.run()
sess.close() #調用sess.close(),釋放資源。
- 利用上下文管理機制自動釋放所有資源。(不用調用sess.close()釋放資源,在退出with語句時,會話自動關閉並釋放資源)
with tf.Session() as sess:
sess.run()
4、Operation
Operation是操作。是Tensorflow圖中的節點,它的輸入與輸出都是Tensor。它的作用是完成各種操作,包括運算操作、矩陣操作、和神經網絡構建操作等。
介紹 | 主要的操作 |
---|---|
數學運算 | Add, Sub, Mul, Div, Exp, Log, Greater, Less, Equal |
數組運算 | Concat, Slice, Split, Constant, Rank, Shape, Shuffle |
矩陣運算 | MatMul, MatrixInverse, MatrixDeterminant |
神經網絡構建操作 | SoftMax, Sigmoid, ReLU, Convolution2D, MaxPool |
檢查點操作 | Save, Restore |
隊列和同步操作 | Enqueue, Dequeue, MutexAcquire, MutexRelease |
張量控制操作 | Merge, Switch, Enter, Leave, NextIteration |