1. 程式人生 > >Tensorflow系列之(一):Tensorflow的基本操作

Tensorflow系列之(一):Tensorflow的基本操作

Tensorflow是一個Google開發的深度學習的框架,十分的好用。下面我們就來簡單介紹一下Tensorflow的基本用法

就我的理解來說,Tensorflow框架的寫法和我們之前寫的程式不太一樣,如果要理解Tensorflow,先要理解它的基本組成部分,tensor

tensor, 張量, 就相當於一個指定維度的陣列,就像numpy裡面的ndarray,tenseflow的框架定義了一個圖,操作就相當於圖中的節點,我們的資料tensor就在節點之間執行(在節點之間流動,所以叫tensorflow)。每次我們要進行計算,必須使用一個session,會話,進行計算

一、Tensorflow的環境搭建

這一部分就先略去了,有時間再詳細介紹

二、宣告變數和常量

就像學習一門程式語言一樣,我們學習Tensorflow也要先學習怎麼對變數和常量進行運算,我們先看怎麼進行變數和常量的宣告

a = tf.Variable( 0.1, dtype= tf.float32 )
b = tf.constant( 0.2, dtype=tf.float32 )

在這裡我們分別定義了變數a和常量b,相應的值就是程式碼中賦的值,現在我們想列印輸出一下它們的值,但是我們不能直接列印,在這之前我們先要初始化session變數

init = tf.initialize_all_variables()
sess = tf.Session
() sess.run(init)

在初始化之後我們就可以進行我們想進行的操作啦!

a = tf.Variable( 0.1, dtype= tf.float32 )
b = tf.constant( 0.2, dtype=tf.float32 )

sess = tf.Session()
sess.run( tf.initialize_all_variables() )

print sess.run( a )
print sess.run( b )
a = tf.Variable(0.1, dtype=tf.float32)
b = tf.constant(0.2, dtype=tf.float32)
c = tf.Variable(0.1
, dtype=tf.float32) sess = tf.InteractiveSession() sess.run(tf.initialize_all_variables()) tmp = tf.assign(c, b) # assign print sess.run(tmp) tmp_var1 = tf.add(a, b) # add tmp_var2 = tf.mul(a, b) # mul print sess.run(tmp_var1) print sess.run(tmp_var2) print 'eval ', b.eval()

對於這裡我的理解是這樣的,在每次有相關的運算的時候,雖然寫了這個運算,但是不會執行,指導我們執行了一個sess.run的操作,才會執行,這個時候就會遞迴地去找運算中的各個量的值是什麼。如果找到了定義那就直接運算就可以了,如果找到了另外一個運算,遞迴地進行另外一個運算,然後再賦值

而且還有需要注意的一點是,我們在定義的時候使用Interactive Session,這樣計算值的時候就可以直接使用tensor.eval(),而且如果這個計算有引數的話,直接使用tensor.eval( feed_dict = {} )就可以了

a = tf.Variable( 0.1, dtype= tf.float32 )
b = tf.constant( 0.2, dtype= tf.float32 )

sess = tf.Session()
sess.run( tf.initialize_all_variables() )

tmp_value = tf.add( a, b )
update_value = tf.assign( a, tmp_value )

for i in range( 5 ):
    print sess.run( update_value )

在這段程式碼當中,每次要計算update_value的時候,都要去遞迴地計算a和tmp_value的值

這裡要特別注意一下,有一個小小的坑(雖然說這個坑很小,但是我在坑裡掉了很長時間),就是初始化值的時候,是run initialize,這個不是說我聲明瞭這句話以後所有tensorflow的初始值全都初始化,而是說當我宣告完了我所有需要的變數的時候,比如我宣告完了神經網路裡面所有的權值,這個時候我再來進行run initialize,然後再進行計算

三、佔位符

tensorflow有一點比較特別的地方,就是會用到佔位符。所謂佔位符,placeholder,就是說我在宣告網路結構的時候,並不知道輸入的資料有多少組,所以就先用佔位符,具體的寫法是這樣的

input = tf.placeholder( tf.float32, [ None, 100 ] )

這裡面的None就是指,不限定輸入的tensor是多少維的

四、提供向量機制

當我們需要像我們設計的神經網路當中輸入資料的時候,我們就需要使用tensorflow的feed_dict機制

sess.run( trainstep, feed_dict = input_layer: x_batches )

這裡x_batches就是我們輸入的圖片資料的變數名,inputlayer就是我們定義的神經網路的輸入層名,通過這種方式來靈活的分離輸入的影象和神經網路的結構,不管是訓練還是預測都可以使用相同的結構

五、tensorflow當中常用的一些函式

tf.reduce_mean( value )
tf.reduce_sum( value )

這裡的reduce就是python中的reduce一樣的意思,求這個向量的和和均值

tf.argmax( value, axis = axis )

這個和numpy裡面的argmax是一樣的,獲取最大值的下標,只是在tensorflow裡面這個函式的軸是要顯式宣告的

trainstep = tf.train.GradientDescentOptimizer(0.01).minimize( cost )

這是tensorflow當中的優化器,以0.01為步長來優化cost,tensorflow當中還自帶了很多的優化器,使用起來非常方便,我們之後會盡量做詳細的介紹

好啦!!有了這篇講的知識,我們就可以去嘗試著做一個簡單的demo啦,在下篇文章當中我們向大家來介紹怎麼用tensorflow來寫一個簡單的CNN來識別手寫數字