TensorFlow總結(一)——TensorFlow基礎

本學期的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章