【TensorFlow】01 TensorFlow簡(jiǎn)介與Python基礎(chǔ)
634
2022-05-30
2.1.2 TensorFlow中的模型
2.1.1節(jié)介紹了TensorFlow的誕生及特點(diǎn),這一小節(jié)主要說明TensorFlow的三種主要模型:計(jì)算模型、數(shù)據(jù)模型和運(yùn)行模型。
(1)計(jì)算模型
計(jì)算圖(Graph)是TensorFlow中一個(gè)最基本的概念,是TensorFlow的計(jì)算模型。TensorFlow中的所有計(jì)算都會(huì)被轉(zhuǎn)化為計(jì)算圖上的節(jié)點(diǎn),可以把計(jì)算圖看作一種有向圖,TensorFlow中的每一個(gè)計(jì)算都是計(jì)算圖上的一個(gè)節(jié)點(diǎn),而節(jié)點(diǎn)之間的邊描述了計(jì)算之間的依賴關(guān)系。例如,通常在構(gòu)建階段創(chuàng)建一個(gè)計(jì)算圖來表示和訓(xùn)練神經(jīng)網(wǎng)絡(luò),然后在執(zhí)行階段反復(fù)執(zhí)行圖中的訓(xùn)練操作,使得參數(shù)不斷優(yōu)化。在圖的構(gòu)建階段,本質(zhì)是各種操作的拼接組合,操作之間流通的張量由源操作產(chǎn)生,只有輸出張量,沒有輸入張量。TensorFlow支持通過tf.Graph()函數(shù)來生成新的計(jì)算圖。
圖2-1中的每一個(gè)節(jié)點(diǎn)都是一個(gè)運(yùn)算,每一條邊都代表了計(jì)算之間的依賴,箭頭方向代表依賴關(guān)系。例如,運(yùn)算a和運(yùn)算b不依賴任何關(guān)系,而有一條由a指向Add的邊和一條由b指向Add的邊,表示Add運(yùn)算是依賴于運(yùn)算a和運(yùn)算b的。
在TensorFlow程序中,系統(tǒng)會(huì)維護(hù)一個(gè)默認(rèn)的計(jì)算圖,通過tf.get_default_graph()函數(shù)可以獲取當(dāng)前默認(rèn)的計(jì)算圖,不同的計(jì)算圖上的張量和運(yùn)算不會(huì)共享。有效地整理TensorFlow中的資源同樣也是計(jì)算圖的重要功能之一。在一個(gè)計(jì)算圖中,可以通過集合(Collection)來管理不同類別的計(jì)算資源,比如通過tf.add_to_collection函數(shù)可以將資源加入集合中,然后通過tf.get_collection獲取集合中的資源。
(2)數(shù)據(jù)模型
張量(Tensor)是TensorFlow中一個(gè)非常重要的概念,是TensorFlow的數(shù)據(jù)模型。在TensorFlow程序中,所有數(shù)據(jù)都可以通過張量的形式來表示。張量的最基本屬性是維度,其中零維張量表示為標(biāo)量(Scalar),一維張量表示為向量(Vector),當(dāng)維數(shù)n超過2時(shí),張量就可以理解為n維數(shù)組,但在TensorFlow中張量并不是以數(shù)的形式實(shí)現(xiàn)的,只是對(duì)TensorFlow中運(yùn)算結(jié)果的引用。在張量中保存的是如何得到數(shù)據(jù)的計(jì)算過程,而不是真正保存這些數(shù)據(jù)。
一個(gè)張量中主要保存的是其名字(Name)、維度(Shape)和類型(Dtype)。例如,張量名字作為張量的唯一標(biāo)識(shí)符,描述了張量是如何計(jì)算出來的。張量維度描述的是張量的維度信息,比如維度為零,則張量就可以表示為標(biāo)量。每一個(gè)張量都有一個(gè)唯一的張量類型,在對(duì)張量進(jìn)行運(yùn)算前,TensorFlow首先會(huì)對(duì)張量進(jìn)行類型檢查,當(dāng)發(fā)現(xiàn)類型不匹配時(shí)就會(huì)保存。對(duì)于張量的使用,其可以作為中間計(jì)算結(jié)果進(jìn)行引用,當(dāng)一個(gè)計(jì)算包含很多中間結(jié)果時(shí),使用張量可大大提高代碼的可讀性;同樣,在計(jì)算圖構(gòu)造完成之后,也可以用張量來獲得結(jié)果。
(3)運(yùn)行模型
會(huì)話(Session)是擁有并管理TensorFlow程序運(yùn)行時(shí)所有資源的概念,是TensorFlow的運(yùn)行模型。當(dāng)所有計(jì)算完成之后,需要關(guān)閉會(huì)話來幫助系統(tǒng)回收計(jì)算資源,否則就可能產(chǎn)生資源泄漏的問題。TensorFlow中使用會(huì)話的模式一般有兩種:一種模式需要明確調(diào)用會(huì)話生成函數(shù)和會(huì)話關(guān)閉函數(shù),當(dāng)所有計(jì)算完成之后,需要明確調(diào)用會(huì)話關(guān)閉函數(shù)以釋放資源。然而,當(dāng)程序因?yàn)楫惓M顺鰰r(shí),會(huì)話關(guān)閉函數(shù)可能不會(huì)被執(zhí)行而導(dǎo)致資源的泄漏。另一種模式是利用Python上下文管理器的機(jī)制,只要將所有的計(jì)算放在with中即可。上下文管理器退出時(shí)會(huì)自動(dòng)釋放所有資源,這樣既解決了因?yàn)楫惓M顺鰰r(shí)資源釋放的問題,同時(shí)也解決了忘記調(diào)用會(huì)話關(guān)閉函數(shù)而產(chǎn)生的資源泄漏問題。在交互式環(huán)境下,通過設(shè)置默認(rèn)會(huì)話的方式獲取張量的取值更加方便,所以TensorFlow提供了一種在交互式環(huán)境下直接構(gòu)建默認(rèn)會(huì)話的函數(shù),使用此函數(shù)會(huì)自動(dòng)將生成的會(huì)話注冊(cè)為默認(rèn)會(huì)話。
TensorFlow 深度學(xué)習(xí)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。