學(xué)過(guò)Python的小伙伴都會(huì)覺(jué)得,python的語(yǔ)法簡(jiǎn)單,邏輯清晰。雖然tensorflow是python的一個(gè)庫(kù)(并不是標(biāo)準(zhǔn)庫(kù)),但是使用并不簡(jiǎn)單,你可能會(huì)被tensorflow的奇怪語(yǔ)法設(shè)計(jì)困惑,所以本文章叫做費(fèi)解的tensorflow,希望通過(guò)本文,讀者可以更好的了解tensorflow。
編程必備hello world
學(xué)習(xí)任何編程語(yǔ)言,可能上來(lái)都是打印輸出下hello world,用python很簡(jiǎn)單,我們一行代碼就可以了。
print('hello world')
就算是先定義為變量,我們也只是需要2行代碼。
a = 'hello world'
print(a)
那我們用tensorflow來(lái)寫,需要3行,代碼不是很多,但是看上去就是很費(fèi)解。
a = tf.constant('hello world')
sess = tf.Session()
print(sess.run(a))
那我們就以這個(gè)簡(jiǎn)單代碼,來(lái)看看tensorflow的語(yǔ)法。
計(jì)算圖
如果把上面代碼抽象出來(lái),其實(shí)就是建立計(jì)算圖和運(yùn)行計(jì)算圖的完整過(guò)程。當(dāng)然讀者就會(huì)問(wèn),什么是計(jì)算圖?其本質(zhì)就是全局?jǐn)?shù)據(jù)結(jié)構(gòu):是一個(gè)有向圖,用于捕獲有關(guān)如何計(jì)算的指令。概念還是比較生硬,圖那我就以流程圖為例,流程中的方框(節(jié)點(diǎn))就是我們tensorflow的定義的數(shù)據(jù),箭頭就是計(jì)算指令。
例如,下面代碼,我們就定義了一個(gè)常量,在計(jì)算圖中就是給了他一個(gè)位置,他就是一個(gè)節(jié)點(diǎn)。打印輸出其說(shuō)明:
- tensorflow張量
- 零維
- 數(shù)據(jù)類型
a = tf.constant(2)
print(a)
# Tensor("Const:0", shape=(), dtype=int32)
通過(guò)下面代碼就可以算是完整的計(jì)算圖(有節(jié)點(diǎn)和計(jì)算)。
two_node = tf.constant(2)
three_node = tf.constant(3)
sum_node = two_node + three_node
會(huì)話
前面說(shuō)到了是建立計(jì)算圖,接著我們就要執(zhí)行計(jì)算圖,這樣代碼才能運(yùn)行。這里就要提到一個(gè)新概念,會(huì)話。會(huì)話的作用是處理內(nèi)存分配和優(yōu)化,使我們能夠?qū)嶋H執(zhí)行由計(jì)算圖指定的計(jì)算。簡(jiǎn)單說(shuō),建立計(jì)算圖,通過(guò)會(huì)話,然后運(yùn)行計(jì)算圖。
這就是為什么tensorflow代碼都有這個(gè)代碼的原因了。
sess = tf.Session()
sess.run()
回到hello world
我們重新在來(lái)看下hello world的代碼。
a = tf.constant('hello world')
sess = tf.Session()
print(sess.run(a))
# hello world
- 第一行,我們建立計(jì)算圖,這里我們是通過(guò)tf.constant來(lái)定義的,其為常量。
- 建立會(huì)話
- 運(yùn)行計(jì)算圖
占位符(placeholder)
前面的程序,我們沒(méi)有輸入,這樣就是只會(huì)輸出同樣的東西。在python中,我們可以通過(guò)iput輸入數(shù)據(jù)。
在tf中,我們需要先定義占位符,然后用feed_dict方法傳入數(shù)據(jù),代碼如下:
a = tf.placeholder(tf.int32)
b = tf.placeholder(tf.int32)
c = a + b
with tf.Session() as sess:
print(sess.run([a,b,c],feed_dict={a:5,b:8}))
# [array(5), array(8), 13]
變量
前面,我們用tf.constant定義了常量,用占位符(placeholder)用于輸入,最后我們看看變量的定義。
說(shuō)變量之前,我們?cè)賮?lái)看看tensorflow這個(gè)單詞,其實(shí)他是分為tensor(張量)和flow(流)。變量在tensorflow就是張量的意思。
這里我們定義一個(gè)一維張量:
a = tf.Variable([0.2,0.4,0.5])
接著如果我們建立會(huì)話,運(yùn)行程序會(huì)報(bào)錯(cuò)。我們需要初始化變量,這里我們不講解底層的原因,我們只需要記住,用到變量加上下面的代碼初始化即可。
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(a))
# [0.2 0.4 0.5]
tensorboard
最后,我們可視化下我們的計(jì)算圖。
a = tf.placeholder(tf.int32)
b = tf.placeholder(tf.int32)
c = a * b
with tf.Session() as sess:
print(sess.run([a,b,c],feed_dict={a:5,b:8}))
writer = tf.summary.FileWriter('log/test1',sess.graph)
writer.close()
接著我們打開(kāi)代碼所在環(huán)境,輸入一下代碼。
tensorboard --logdir=G:\我的Python項(xiàng)目\深度學(xué)習(xí)\deeplearn\log\test1
在瀏覽器中輸入http://localhost:6006
總結(jié)
本文通過(guò)最簡(jiǎn)單的hello world代碼,詳細(xì)講解了tf的語(yǔ)法。我們需要記住,整個(gè)過(guò)程就是建立和運(yùn)行計(jì)算圖的流程。