tensorflow實戰一
阿新 • • 發佈:2018-12-12
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模型都是首先構建靜態圖,然後再執行。想必大家對模型構建有了一定的瞭解,大家可以去實現更為複雜的迴歸或分類例子。今天暫時先講到這裡,樓主會繼續更文的!