tensorflow入门基础
tensorflow程序一般分為兩個階段,在第一個階段需要定義圖中所有的計算。在第二個階段就是執行計算。
1. 計算圖的使用
首先在tensorflow的程序中系統會維護一個默認的計算圖,通過tf.get_default_graph()可以獲取當前默認的計算圖。
- 下面展示了 如何獲得一個運算所屬的計算圖以及默認的計算圖:
運算結果:
Tensor("add_4:0", shape=(2,), dtype=float32) <tensorflow.python.framework.ops.Graph object at 0x119d8c550> <tensorflow.python.framework.ops.Graph object at 0x119d8c550> True- 除了使用默認的計算圖,tensorflow還支持通過tf.Graph函數獲得新的計算圖,這樣的話不同的計算圖上的張量和運算都不會共享。
運算結果:
runfile('/Users/lilong/Desktop/tt.py', wdir='/Users/lilong/Desktop') [0. 0.] [1.]由運行結果可以看出,每個計算圖中定義了名稱相同的“v“變量,但是定義了不同的初始值,運行結果也顯示值不同,可以看出不同的計算圖可以獨立運行,變量不會沖突。tensorflow不僅可以隔離運算張量,還可以指定運算的設備(tf.Graph.device),也即是管理張量的計算機制,這也就為tensorflow使用gpu提供了機制。示例:
g=tf.Graph() # 指定計算運行的設備 with g.device('/gpu:0'):result=a+b2. 張量
在tensorflow中所有的數據都是通過張量的形式表示的,張量也可以被簡單理解為多維數組。其中0階張量就是標量,也就是一個數;一階張量為向量,也就是一維數組;n階張量可以理解為一個n維數組。但是張量的實現并不是直接采用數組的形式,他只是對tensorflow運算結果的一個引用,里面保存的并不是真正的數字結果,保存的而是這些數字的計算過程,這也是為什么tensorflow程序初始化后還要打開會話運行才能得到張量的運算結果。
import tensorflow as tf a = tf.constant([1.0, 2.0], name="a") b = tf.constant([2.0, 3.0], name="b") result=tf.add(a,b,name='add') print('result:',result)結果:
result: Tensor("add:0", shape=(2,), dtype=float32)這里的顯示表明得到的結果是一個張量的結構,并沒有進行真正的計算。這里顯示了張量的三個屬性:名字、維度、類型。
張量的第一個屬性名字是其唯一的標示符,同樣也給出了該標量是如何計算出來的。其命名方式是:node:src_output的形式。其中node是節點的名稱,src_output表示當前張量來自節點的第幾個輸出。
張量的第二個屬性是張量的維度。比如上述的shape(2,)就代表是個一維數組,長度為2。
張量的第三個屬性是類型。這里要注意的是tensorflow會對運算的所有張量進行類型檢查,當發現不匹配時會報錯,即是運算的張量類型必須一致。
張量的兩個用途:
- 第一個是對中間結果的引用。當一個計算模型很復雜時,會包含很多的中間計算結果,通過張量可以大大提高代碼的可讀性。
- 第二個用處是當計算圖構造完成時,通過張量可以獲得計算結果,也就是真實的數值。雖然張量本身沒有存儲具體的數字,但通過會話tf.session().run(result)就可以得到具體的數字。這里的意思也就是說,通過張量可以大大使代碼明了清晰,會話計算結果時不用引用一大段定義和參數,直接應用一個定義好的張量就可以了。
3. 會話
在定義好所有的運算之后,會話擁有并管理tensorflow的程序運行時的所有資源,當所有的計算完成后需要關閉會話并幫助系統收回資源,否則會出現資源泄漏的問題。
3.1 tensorflow的會話有兩種形式:
- 第一種是需要明確調用的會話生成函數和關閉會話函數。
使用第一種模式,在所有的計算完成后,需要明確調用session.close()函數來關閉會話,并釋放資源,但是由于一些原因,關閉會話可能不會被執行從而導致資源泄漏。所以不推薦這種方式來使用會話。
- 第二種是使用python的上下文管理器來使用會話。
這里是使用python的上下文管理器來的機制來管理這個會話,這樣即解決了異常退出時資源釋放的問題,同時也解決了忘記調用session.close函數而產生的資源泄漏。
3.2 指定默認會話
上面介紹過說tensorflow會自動生成一個默認的計算圖,如果沒有指定,運算會自動加入這個計算圖中。tensorflow會話也有類似的機制,但其不會自動生成默認的會話,而需要手動指定默認會話,當默認的會話被指定后就可以通過tf.tensor.eval()函數來計算一個張量的取值了。
sess = tf.Session() with sess.as_default():print(result.eval())而上述計算result的方法還可以通過以下方式實現:
sess = tf.Session() # 下面的兩個命令有相同的功能。 print(sess.run(result)) # 會話調用計算 print(result.eval(session=sess)) # 張量直接eval計算- 這里還有一種:使用tf.InteractiveSession構建會話:
在交互式環境下(比如python),通過設置默認會話的方式來獲取張量更加方便,所以tendorflow提供了一種交互式環境下直接構建默認會話的函數,那就是 tf.InteractiveSession,這個函數會自動將生成的會話注冊為默認會話:
sess = tf.InteractiveSession () # 默認會話下的直接張量調用計算 print(result.eval()) sess.close()通過tf.InteractiveSession函數可以省去將產生的會話注冊為默認會話的過程。
- 通過ConfigProto配置會話
通過ConfigProto可以配置類似并行的線程數、gpu分配策略、運算超時時間等參數,在這些參數中,最常用的有兩個。
第一個是allow_soft_placement:當為true時,在某些情況下(gpu無法直接計算)可以將gpu的計算放到cpu上進行。這個參數的默認值為false,但是一般情況下都設置為true,這個是為了使代碼的可移植性更強。也即是在某些情況下gpu無法計算,在不報錯的情況下可以移植到cpu上繼續計算。
第二個參數是log_device_placement,當為true時日志中將會記錄每個節點被安排在了哪個設備上方便調試。而在生產環境中將這個參數設為false可以減少日志量。
以上只是tensorflow的一些基礎,但很有必要要掌握。
參考:《Tensorflow實戰Google深度學習框架》
總結
以上是生活随笔為你收集整理的tensorflow入门基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 证券开户去哪里
- 下一篇: 安全高效的借贷平台有哪些 可以关注这几