1. 程式人生 > >tensorflow實戰一

tensorflow實戰一

tensorflow實戰一

概述

本來筆者想從tensorflow的基礎概念開始寫起,後來感覺還是邊寫程式碼邊學概念來的靠譜,下面開始首次學習。

構建並執行一個基本圖

tensorflow中的運算被組織成一個有向無環圖。圖的每個節點是一次操作,這樣一個圖在構成的時候是一個靜態圖,並沒有資料流動。圖要在session中被執行,一個session可以執行多個圖。執行起來的圖才是有資料流動的圖。話不多說,開始程式碼:

#定義常量
m1=tf.constant([[3,3]])
m2=tf.constant([[2],[3]])
mul=tf.matmul(m1,m2)
#上面程式碼構建了一個向量乘法圖,有三個節點m1,m2,mul。

#定義一個session,啟動上述圖
sess=tf.Session()
result=sess.run(product)
print m1,mul,result
sess.close()
#可以發現只有執行之後圖中節點才有資料,m1,mul的值均為0;result的值不是零。

變數和變數賦值

tensorflow中的變數需要先進行賦值操作才能有資料。

#定義部分
state=tf.Variable(0,name='counter') #建立一個變數初始化為0
new_value=tf.add(state,1)
update=tf.assign(state,new_value)#tensor中的賦值操作,把new_value的值賦給state
init=tf.global_variables_initializer() #一個全域性變數初始化,只要使用全域性變數就要初始化
#執行部分
sess=tf.Session()
sess.run(init)
print sess.run(state)
for _ in range(5):
    sess.run(update)
    print (sess.run(state))
sess.close()

看了兩個小例子,大家應該有所發現了,tensorflow中程式碼分為兩個過程,首先定義一個靜態圖,然後在session中執行。

feed和fetch

feed用於給靜態圖喂資料,tensorflow中提供佔位符這種節點,feed就是給佔位符賦值的操作。
fetch用於檢視會話執行結果

#fetch
input1=tf.constant(3.0)
input2=tf.constant(2.0)
input3=tf.constant(3.0)
add=tf.add(input2,input3)
mul=tf.multiply(input1,add)
sess=tf.Session()
result=sess.run([mul,add])
print result #發現打印出來的result包含mul和add的值

#feed
input1 = tf.placeholder(tf.float32) #建立佔位符,佔位符就是空白的節點
input2 = tf.placeholder(tf.float32)
mul = tf.multiply(input1,input2)
result = sess.run(mul,feed_dict={input1:9,input2:1.1}) #喂資料
print result
sess.close()

佔位符還可以定義型別,維度,名稱屬性,上面僅展示了型別屬性,有需要的童鞋可以自己再深入學習。

一個簡單迴歸模型訓練

下面構建一個梯度下降的迴歸模型來擬合y=k*x+b

#定義100組樣本點
x_data = np.random.rand(100)
y_data = x_data*0.1 + 0.2
#初始化引數k,b都為0
b = tf.Variable(0.)
k = tf.Variable(0.)
y = k*x_data + b
#定義代價函式,誤差的平方和的均值(不明白代價函式為什麼這樣的童鞋可以去學一下原理)
loss = tf.reduce_mean(tf.square(y_data-y))
#定義梯度下降法來訓練優化器,學習率設定為0.01
optimizer = tf.train.GradientDescentOptimizer(0.01)
#定義優化器的目標為最小化loss
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
#執行圖,迭代20次
sess = tf.Session()
sess.run(init)
for step in range(201):
    sess.run(train)
    if step%20==0:
        print step,sess.run([k,b])
sess.close()

下面為迭代20次的結果,大家也可以隨意改動一下k、b、學習率來看看最後結果是否仍然擬合的很好。

小結

每一個tensorflow模型都是首先構建靜態圖,然後再執行。想必大家對模型構建有了一定的瞭解,大家可以去實現更為複雜的迴歸或分類例子。今天暫時先講到這裡,樓主會繼續更文的!