TensorFlow初步(2)

大家好我是zyy,本人是機器學習和深度學習的初學愛好者,想跟大家一起分享我的學習經驗,大家一起交流。我寫的東西不一定全對,但肯定是我一步一步走出來的坑,嚼爛了的經驗,可以供大家直接「吸收」

我的文章主要會涉及各種機器學習和深度學習演算法的推導和輪子的實現,以及一些小的應用demo,偶爾還會有一些論文的演算法實現。

文中出現的所有代碼都可以在我的GitHub上找到。 GitHub

TensorFlow基本

總的來說TensorFlow有以下幾個概念

  • 用圖(graph)來表示你所搭建的結構,整個程序就是數學在你這個graph里進行加工處理的過程
  • 用會話(session)來表示你這次要運行程序,即開始一個session就是開始跑你寫的程序
  • 用tensor表示數據,tensor是張量,你的每個數據(scalar),或者說每組數據(vector)都是tensor
  • 用variable來表示變數,注意是定義的全局那種的量(並非真正意義上的全局變數,而是可以通過其它函數隨時更改的那種,隨著使用你會有更好的理解,這裡我不太好描述)
  • 用feed和fetch進行任意的操作賦值或者獲取數據
  • 用Node表示節點,表明數據在圖中流動經過的點
  • 用Operation表示節點的操作,通過operation來加工處理數據

TensorFlow翻譯過來就是「張量飛翔」(別吐槽我的英語水平...) 即數據在圖中流動,最後得到結果,很好的表現了TensorFlow處理數據的方式。

現在我們來一步一步看一下具體處理過程,以上一章的程序為主。

c = tf.constant(1.5) # creat a constantn

創建一個常量,裡面的值為1.5

x = tf.Variable(1.0, name="x") # creat a variablen

創建一個變數,初始值為1

add_op = tf.add(x, c) # creat add tensorn

定義一個x+c得到的tensor

assign_op = tf.assign(x, add_op)# creat assign tensorn

定義一個用於賦值的tensor

init = tf.global_variables_initializer() # init variables *n

初始化所有的變數,注意,運行前一定要有這句

sess = tf.Session() # get session objectn

獲得整體的Session對象

sess.run(init) # run sessionn

調用Session的run方法,進行所有變數的初始化

sess.run(assign_op) # run assgin operationn

運行賦值操作

print(sess.run(x)) # should print out 2.5n

列印複製後的值,應該是x=x+c,得x=2.5。

sess.close() # close sessionn

使用後關閉Session對象。

我們進一步分析, tf.add()和tf.assign()都是operation,是操作數據的方法, add_op和assign_op都是臨時tensor變數, 用Session.run()可以執行某一個tensor所需要的操作, 就如上面提到, sess.run(assign_op)進行的操作是先進行x+c的tf.add()的operation, 運行add_op這個tensor, 然後進行tf.assign()的operation, 運行assign_op這個tensor, 給x重新賦值。

我們可以進行下面實驗

sess.run(init)nprint(sess.run(x)) # should print 1.0nnprint(sess.run(add_op)) # should print 2.5(x+c=2.5)nprint(sess.run(x)) # should print 1.0(x has not been assigned)nnprint(sess.run(assign_op)) # should print 2.5nnprint(sess.run(x)) # should print 2.5(x has been assigned)nnsess.close()n

具體分析

本章節是借鑒(翻譯加改寫)一位高人的成果,他的Github地址。各位有興趣可以去看看他的原文。

創建變數的時候會先創建一個變數的引用節點, 一個擁有變數初值的常量節點, 以及一個賦值tf.assign操作的operation節點。 為了便於理解,當我們創建一個變數Variable時, 我們創建了一個VariableOp類型的operation, 並且它的名字是變數Variable的名字, 但進行init這個opration操作的時候,assign操作會自動進行。

創建Session是為了將之前定義好的節點「編譯」(對定義好的節點準備進行運算,而不是編譯程序的意思), 運行tf.global_variables_initializer()進行初始化, 對變數進行賦值初始化。

之後運行tf.add()和tf.assign()進行運算, tf.assign()將變數x進行賦值。 (體會一下為什麼要進行變數的定義, 如果是自己來實現程序的時候, 這個賦值更新操作會不會麻煩很多)

Life is short, we use python

下面給大家寫得精簡一點,可以作為初學者的模板

import tensorflow as tfnx = tf.Variable(1.0, name=x)nadd_op = tf.add(x, tf.constant(1.5))nassign_op = tf.assgin(x, add_op)ninit = tf.global_variables_initializer()nwith tf.Session() as sess:n sess.run(init)n sess.run(assign_op)n print(sess.run(x))n

練習

在那位高人的博客里給了一個練習,我也貼下來給大家。 用TensorFlow來做斐波那契數列。

import tensorflow as tfnnwith tf.Graph().as_default() as g:nn # Add code that will calculate and output the Fibonacci sequencen # using TF. You will need to make use of tf.matmul() andn # tf.assign() to perform the multiplications and assign the resultn # back to the variable fib_seq.nn fib_matrix = tf.constant([[0.0, 1.0],n [1.0, 1.0]])nn ### SOLUTION START ###n # Put your solution code here.nn # Step 1.n # Change this line to initialize fib_seq to a 2x1 TensorFlown # tensor *Variable* with the initial values of 0.0 and 1.0. Hint:n # Youll need to make sure you specify a 2D tensor of shape 2x1,n # not a 1D tensor. See fib_matrix above (a 2x2 2D tensor) to guiden # you.n fib_sequence = Nonen n # ans:n # fib_sequence = tf.Variable([[0.0], [1.0]])nn n # Step 2.n # Change this line to multiply fib_matrix and fib_sequence using tf.matmul()n next_fib = Nonen n # ans:n # next_fib = tf.matmul(fib_matrix, fib_sequence)n n n # Step 3.n # Change this line to assign the result back to fib_sequence using tf.assign()n assign_op = Nonen n # ans:n # assign_op = tf.assign(fib_sequence, next_fib)n n ### SOLUTION END ###n n init = tf.initialize_all_variables()n with tf.Session() as sess:n sess.run(init)n for step in range(10):n sess.run(assign_op)n print(sess.run(fib_sequence))n

推薦閱讀:

TAG:Python | 深度学习DeepLearning | TensorFlow |