深度學習|費解的tensorflow

學過Python的小夥伴都會覺得,python的語法簡單,邏輯清晰。雖然tensorflow是python的一個庫(並不是標準庫),但是使用並不簡單,你可能會被tensorflow的奇怪語法設計困惑,所以本文章叫做 費解的tensorflow ,希望通過本文,讀者可以更好的瞭解tensorflow。
程式設計必備hello world
學習任何程式語言,可能上來都是列印輸出下hello world,用python很簡單,我們一行程式碼就可以了。
print('hello world')
就算是先定義為變數,我們也只是需要2行程式碼。
a = 'hello world' print(a)
那我們用tensorflow來寫,需要3行,程式碼不是很多,但是看上去就是很費解。
a = tf.constant('hello world') sess = tf.Session() print(sess.run(a))
那我們就以這個簡單程式碼,來看看tensorflow的語法。
計算圖
如果把上面程式碼抽象出來,其實就是 建立計算圖 和 執行計算圖 的完整過程。當然讀者就會問,什麼是計算圖?其本質就是全域性資料結構:是一個有向圖,用於捕獲有關如何計算的指令。概念還是比較生硬,圖那我就以流程圖為例,流程中的方框(節點)就是我們tensorflow的定義的資料,箭頭就是計算指令。
例如,下面程式碼,我們就定義了一個常量,在計算圖中就是給了他一個位置,他就是一個節點。列印輸出其說明:
- tensorflow張量
- 零維
- 資料型別
a = tf.constant(2) print(a) # Tensor("Const:0", shape=(), dtype=int32)

通過下面程式碼就可以算是完整的計算圖(有節點和計算)。
two_node = tf.constant(2) three_node = tf.constant(3) sum_node = two_node + three_node

會話
前面說到了是建立計算圖,接著我們就要執行計算圖,這樣程式碼才能執行。這裡就要提到一個新概念, 會話 。會話的作用是處理記憶體分配和優化,使我們能夠實際執行由計算圖指定的計算。簡單說,建立計算圖,通過會話,然後執行計算圖。
這就是為什麼tensorflow程式碼都有這個程式碼的原因了。
sess = tf.Session() sess.run()
回到hello world
我們重新在來看下hello world的程式碼。
a = tf.constant('hello world') sess = tf.Session() print(sess.run(a)) # hello world
- 第一行,我們建立計算圖,這裡我們是通過tf.constant來定義的,其為常量。
- 建立會話
- 執行計算圖
佔位符(placeholder)
前面的程式,我們沒有輸入,這樣就是隻會輸出同樣的東西。在python中,我們可以通過iput輸入資料。
在tf中,我們需要先定義佔位符,然後用feed_dict方法傳入資料,程式碼如下:
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)用於輸入,最後我們看看變數的定義。
說變數之前,我們再來看看tensorflow這個單詞,其實他是分為 tensor(張量)和flow(流) 。變數在tensorflow就是張量的意思。
這裡我們定義一個一維張量:
a = tf.Variable([0.2,0.4,0.5])
接著如果我們建立會話,執行程式會報錯。我們需要初始化變數,這裡我們不講解底層的原因,我們只需要記住,用到變數加上下面的程式碼初始化即可。
sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) print(sess.run(a)) # [0.2 0.4 0.5]
tensorboard
最後,我們視覺化下我們的計算圖。
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()
接著我們開啟程式碼所在環境,輸入一下程式碼。
tensorboard --logdir=G:\我的Python專案\深度學習\deeplearn\log\test1
在瀏覽器中輸入 http://localhost:6006

總結
本文通過最簡單的hello world程式碼,詳細講解了tf的語法。我們需要記住,整個過程就是建立和執行計算圖的流程。