Graph
在前面的文章中禾怠,我們學(xué)會(huì)了如何在TensorFlow(TF)中創(chuàng)建Tensor恩商,Variable和Operation來組成一個(gè)graph变逃,以及如何利用Session運(yùn)行一個(gè)graph。但是這個(gè)graph對(duì)象究竟是在什么時(shí)候創(chuàng)建的怠堪?我們能否同時(shí)創(chuàng)建多個(gè)graph呢揽乱?
要回答這個(gè)問題,我們首先要了解在默認(rèn)的情況下粟矿,TF是如何創(chuàng)建graph的凰棉。TF在library加載以后,會(huì)自動(dòng)創(chuàng)建一個(gè)Graph對(duì)象陌粹,并把它作為default graph撒犀,我們創(chuàng)建的操作會(huì)自動(dòng)放在這個(gè)default graph里。我們也可以不使用TF自動(dòng)創(chuàng)建的graph,而是創(chuàng)建自己的graph對(duì)象并設(shè)置為default或舞,然后添加各種操作荆姆,例如:
注意,如果打算運(yùn)行自己創(chuàng)建的graph映凳,一定要把它傳遞給
tf.Session
的graph
參數(shù)胆筒。
我們也可以自己創(chuàng)建多個(gè)Graph對(duì)象,將它設(shè)為default graph后魏宽,添加各種操作:
name scopes and TensorBoard
到目前為止腐泻,我們學(xué)習(xí)了創(chuàng)建TF graph所需的所有原材料决乎。前面的例子都很簡(jiǎn)單队询,一個(gè)graph中只有幾個(gè)節(jié)點(diǎn),然而在實(shí)際工作中构诚,我們需要?jiǎng)?chuàng)建包含成百上千個(gè)節(jié)點(diǎn)的graph蚌斩。如何有效的組織和查看graph就顯得尤為重要。在TF中范嘱,我們可以通過name scope的方式來組織節(jié)點(diǎn)送膳,并利用TensorBoard來可視化。
name scopes的作用就是把相關(guān)的操作組織在一起丑蛤,形成一個(gè)大的block叠聋。在TensorBoard中查看graph的時(shí)候,會(huì)發(fā)現(xiàn)所有的節(jié)點(diǎn)都被封裝在一個(gè)個(gè)block中受裹。
我們先來利用name scope創(chuàng)建一個(gè)簡(jiǎn)單的graph碌补,并保存在文件中:
接著在終端中啟動(dòng)TensorBoard:
$ tensorboard --logdir='./name_scope_1'
打開瀏覽器,在地址欄中輸入http://127.0.1.1:6006
棉饶,點(diǎn)擊GRAPH標(biāo)簽厦章,就可以看到下面的結(jié)果:
此時(shí)我們只能看到兩個(gè)box,分別代表的是我們定義的兩個(gè)name scope照藻,我們點(diǎn)擊box右上角的+號(hào)袜啃,就可以展開box,看到里面的節(jié)點(diǎn):
接下來我們創(chuàng)建一個(gè)更復(fù)雜一些的graph:
在TensorBoard中我們可以清楚的看到:Transformation scope包含了4個(gè)scope幸缕,這4個(gè)scope又分成了2層(用不同的顏色表示)群发,第一層的A和B把它們的output傳給了第二層的C和D,然后C和D把它們的output傳給了最后一個(gè)節(jié)點(diǎn)发乔。
我們可以進(jìn)一步查看4個(gè)scope內(nèi)部的結(jié)構(gòu):
從這個(gè)例子可以看到熟妓,將復(fù)雜的網(wǎng)絡(luò)分解成各個(gè)block和layer,可以讓我們快速地理解網(wǎng)絡(luò)的結(jié)構(gòu)列疗。
我們通過簡(jiǎn)單的例子學(xué)習(xí)了TensorFlow中的一些最基本的概念滑蚯。這是我們看懂TF代碼的前提條件,也是向構(gòu)建復(fù)雜神經(jīng)網(wǎng)絡(luò)邁出的堅(jiān)實(shí)一步。預(yù)知后事如何告材,且聽下回分解坤次!
參考文獻(xiàn)
- Giancarlo Zaccone. Getting Started with TensorFlow, 2016
- Sam Abrahams et al. TensorFlow for Machine Intelligence: A Hands-On Introduction to Learning Algorithms, 2016