TensorFlow学习笔记之一(TensorFlow基本介绍)
文章目錄
- TensorFlow計算模型---計算圖
- 計算圖的使用
- TensorFlow數據模型---張量
- TensorFlow運算模型---會話
- 使用tf.InteractiveSession在交互式環境直接構建默認會話
- 通過ConfigProto配置會話
- 小結
TensorFlow計算模型—計算圖
在TensorFlow有連個重要的概念,Tensor和Flow。
Tensor就是張量,張量可以被簡單理解為多維數組,也就是矩陣。它代表著TensorFlow的數據結構。
Flow意思是“流”,它直觀表達了張量之間通過計算相互轉換的過程。
TensorFlow是一個通過計算圖的形式來表述計算的編程系統。TensorFlow中的每個計算都是計算圖上的一個節點,而節點之間的邊描述了計算機之間的依賴關系。
兩個向量相加樣例的計算圖。
計算圖的使用
TensorFlow程序一般可以分為兩個階段:第一階段定義計算圖中的所有的計算;第二階段執行計算。
下面代碼為第一階段,定義計算
TensorFlow會自動將計算轉化為計算圖上的節點。在TensorFlow程序中,系統會自動維護一個默認的計算圖,通過tf.get_default_graph()函數獲取當前默認的計算圖。
除了默認的計算圖,TensorFlow支持通過tf.Graph函數生成新的計算圖。不同的計算圖上的張量和計算不會共享。
計算圖只描述計算過程,不進行計算。
TensorFlow數據模型—張量
在TensorFlow中,所有的數據都是通過張量的形式來表示。在功能角度來看,張量可以被理解為多維數組。其中零階張量表示表示標量,也及時一個數。一階張量為向量,即一維數組。n階張量可以理解為一個n維數組。但是張量在TensorFlow中實現并不直接采用數組的形式,它只是對TensorFlow中運算結果的引用。
從代碼可以看出,TensorFlow計算結果不是一個具體的數字,而是一個張量的結構。其中最主要有三個屬性:名字(name),維度(shape)和類型(type)。
張量的第一個屬性名字不僅是一個張量的唯一標識符,也給出了這個張量是如何被計算出來的。因為計算圖上的每個節點代表了一個計算,計算的結果偶就保存在張量之中,所以張量和計算圖上的計算結果是對應的。這樣張量的命名就可以通過“node:src_output”的形式來給出。其中node為節點名稱,src_output為當前張量來自節點的第幾個輸出。比如"add:0"表示張量result是計算節點add輸出的第一個結果。
第二個屬性,表明了張量的維度(shape),如shape=(2,)表示張量result是一個一維數組,長度為2.
第三個屬性,類型(type),每個張量會有一個唯一的類型。TensorFlow會對參與運算的所有張量進行檢查,張量類型不匹配會報錯。
對于張量的類型,可以在創建時指定,比如,c = tf.constant([1, 2], name="c",dtype=tf.float32)
不指定,TensorFlow會給出默認的類型,不帶小數點會默認為int32,帶小數點默認為float32。
TensorFlow支持的14中類型
- 實數(tf.float32,tf.float64)
- 整數(tf.int8,tf.int16,tf.int32,tf.int64,tf.uint8)
- 布爾型(tf.bool)
- 復數(tf.complex64,tf.complex128)
TensorFlow運算模型—會話
會話擁有并管理TensorFlow程序運行時所有的資源。所有就算完成后需要關閉會話來幫助系統回收資源,否則會出現資源泄漏的問題。TensorFlow有兩種模式:
sess = tf.Session() sess.run() sess.close()使用這種模式時,在所有的計算完成后,需要明確調用Session.close()函數來關閉會話并釋放資源。然而,當程序因為異常退出時,關閉會話的函數可能就不會被執行從而導致資源泄漏。
為了解決程序因異常退出導致資源釋放的問題。TensorFlow可以通過Python的上下文管理器來使用會話。代碼如下:
這樣既避免了因為異常退出時資源釋放的問題,同時也解決了忘記調用Session.close()而導致資源泄漏的問題。
前面提到了過tensorflow會生成一個默認的計算圖,如果沒有特殊指定,運算會自動加入到這個計算圖中。同樣TensorFlow的會話也有類似的機制。但他不會生成默認的會話,而是需要手動指定。當默認的會話被指定后,可以通過tf.Tensor.eval()函數來計算一個張量的取值,代碼如下:
# 引入tensorflow,并取別名為tf import tensorflow as tf# 定義張量a,名字為a,內容為[1.0,2.0]的向量 a = tf.constant([1.0, 2.0], name="a") #1 b = tf.constant([1.0, 2.0], name="b")result = a + bsess = tf.Session() # 將產生的會話注冊為默認的會話 with sess.as_default():print(result.eval())結果如下
可以看出,其本質為矩陣的加法運算。
另一種實現:
# 引入tensorflow,并取別名為tf import tensorflow as tf# 定義張量a,名字為a,內容為[1.0,2.0]的向量 a = tf.constant([1.0, 2.0], name="a") #1 b = tf.constant([1.0, 2.0], name="b")result = a + bsess = tf.Session() # 下面兩個代碼有相同的功能 print(sess.run(result)) print(result.eval(session=sess))使用tf.InteractiveSession在交互式環境直接構建默認會話
import tensorflow as tf a = tf.constant([1.0, 2.0], name="a") b = tf.constant([1.0, 2.0], name="b") result = a + b sess = tf.InteractiveSession() print(result.eval()) [2. 4.] sess.close()
通過tf.InteractiveSession()可以省去將產生的會話注冊為默認會話的過程。
無論是哪個,都可以通過ConfigProto Protocol Buffer來配置需要生成的會話。
通過ConfigProto配置會話
config = tf.ConfigProto(allow_soft_placement=True,log_device_placement=True)sess1 = tf.InteractiveSession(config=config) sess2 = tf.Session()對于ConfigProto(),他可以配置類似并行的線程數、GPU分配策略、運算超時時間等參數。最常用的參數有兩個:allow_soft_placement和log_device_placement
| allow_soft_placement | False | 為True時,表示運算在GPU上執行 |
| log_device_placement | Flase | True時,日志將會記錄每個節點被安排到哪個設備上以方便調試 |
對于allow_soft_placement,當它為True時,一下三種情況,GPU運算都會放在CPU上運行
- 運算無法再GPU上運行
- 沒有GPU資源
- 運算輸入包含了對CPU計算結果的引用(就是需要CPU運算的結果)
小結
基于上面的代碼情景,畫出如下圖形:
對于TensorFlow中的張量、計算圖和會話。個人看法如下圖:
計算圖是我們設計好的算法,張量是存放計算的數據的。但是,此時算法并沒有運行起來。
等到計算圖定義好了后,再將計算圖放在會話中跑起來。
總結
以上是生活随笔為你收集整理的TensorFlow学习笔记之一(TensorFlow基本介绍)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从JDBC到数据库连接池
- 下一篇: TensorFlow学习笔记之二(使用T