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