深度學(xué)習(xí)|費(fèi)解的tensorflow

學(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ì)算圖的流程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容