昨天因為時間上的關係,對Tensorflow僅做了非常初步的介紹,剛好今天颱風假,時間比較多,所以今天的份量會比較多哦~準備接招!
先再補充介紹一些名詞:
1.張量(tensor):昨天有提到,就是N維陣列,可以想成是數據。
2.節點(op):有運算操作的概念,當一個op獲得數個Tensor時,會執行計算可能產生一個或多個Tensor。
3.會話(session):Tensorflow是基於數據流圖的學習框架,而Session就是圖和執行之間的媒介。
因為Tensorflow經常用於訓練「大規模深度神經網路」計算,往往太過複雜,為了能夠更清楚其中的奧秘,才會有了Tensorboard的發展,Tensorboard是用於視覺化數據流程、損失函式查看或者準確度變化的分析等等,用Tensorboard都可以輕易達成目的
import tensorflow as tf #引入函式庫
x = tf.constant([2],shape = [2,3],name = 'a')
#2.shape其實很像reshape的概念,就是把它的形狀改變!
#3.name就是重新命名,讓它在視覺化時有個名分
y = tf.constant([3],shape = [2,3],name = 'b')
z = tf.add(x,y)
write = tf.summary.FileWriter('./graphs',tf.get_default_graph())
#tf.summary.FileWriter生成一個空間讓指定的東西跑進去
#1.路徑(這樣的寫法會跑去程式檔的資料夾位置那),graphs是名稱
#2.tf.get_default_graph()獲取當前默認的計算圖
with tf.Session() as sess : #命名;且文件關閉後釋放資源
print(tf.Session().run(z)) #啟動數據流圖
輸出:
[[5 5 5]
[5 5 5]]
輸出除了上面之外,會在資料夾產一個檔案,如:
在上述這個程式碼中除了改變tensor的形狀外,也重新命名tensor,並且加上tensorboard的繪製,但要查看tensorboard的圖,需要另外開啟。以下是步驟:
1.開啟另一個命令提示字元,並且啟動虛擬機(我的筆電虛擬機名字取tensorflow-gpu):
2.然後移動到放置graphs資料夾的地方:
3.然後輸入 tensorboard --logdir="./graphs":
如果沒有自動開啟新網頁,就去最下面,下面會有網址,複製貼到網頁上。
4.然後就會出現下圖:
可以看到張量a,b進入到add的節點進行運算!當然這是很基本的數據流圖,所以看起來會感覺沒什麼,但當神經網路變複雜後就會非常精彩了,還有上面有提到的損失下降圖和準確率上升圖我們到後面有小題目演練時會再拉出來提!
1.常數(constant):上篇有提到的,固定數值的張量。
2.變量(variable):在tensorflow中,變量跟我們一般的程式變數不太一樣,尤其是只要有設定變量,一定要記得初始化,且要經過sess.run才能成功被激活。變量可透過運行操作來改變其中的張量。
import tensorflow as tf
a = tf.Variable(5,name = "a")
b = tf.Variable(17,name = "b")
c = a*b
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
#全部變量初始化,沒這行會錯
print(sess.run(c))
輸出:
85
3.佔位符(placeholder):是一種常量,但要在run內傳遞,不像constant直接給定數值,而是由外部傳來的data進行給值。
import tensorflow as tf
x = tf.placeholder(tf.float32,shape=[3]) #1.dtype:32位浮點數2.形狀3
y = tf.constant([5,5,5],tf.float32)
z = x + y
with tf.Session() as sess:
#print(sess.run(z)) #只有這樣會有bug,因為你還沒給placeholder數值,他只是佔了空間而已
print(sess.run(z ,feed_dict ={x : [1,2,3]}) )
輸出:
[6. 7. 8.]
Tensorflow支援的基本操作:
圖片來源
以上有許多簡單的運算其實可以不用打到tf.XXX,可以直接用python一般的程式碼去計算,如tf.add()和"+"就幾乎是一樣的,所以上述這些就不再多做說明。
我們會著重在以下比較特別,卻有機會會使用到的指令:
1.上面沒有的一些基礎的操作(因為比較簡單直接coding吧!):
import tensorflow as tf
x = tf.constant([-1,2],name = 'x',dtype = tf.float32)
y = tf.constant([[0,2],[2,3]],name = 'y',dtype = tf.float32)
with tf.Session() as sess:
print(sess.run(x))
print(sess.run(y))
print('*'*40)
print(sess.run(tf.square(x))) #平方
print(sess.run(tf.abs(x))) #絕對值
print('*'*40)
print(sess.run(tf.exp(y))) #取e
print(sess.run(tf.sqrt(y))) #開根號
print('*'*40)
print(sess.run(tf.pow(y,3))) #幾次方的意思,這裡是3次方
輸出:
[-1. 2.]
[[0. 2.]
[2. 3.]]
****************************************
[1. 4.]
[1. 2.]
****************************************
[[ 1. 7.389056]
[ 7.389056 20.085537]]
[[0. 1.4142134]
[1.4142134 1.7320508]]
****************************************
[[ 0. 8.]
[ 8. 27.]]
2.創建全部是0的張量:
語法:tf.zeros(shape, dtype=tf.float32, name=None)
import tensorflow as tf
a = tf.zeros(shape=[4, 5], dtype=tf.int32, name='a')#是4*5的矩陣
with tf.Session() as sess:
print(sess.run(a))
輸出:
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]
3.序列:
(1)tf.lin_space:會平均計算,然後在間隔中產生數值
語法:tf.lin_space(start,stop,num,name=None)
import tensorflow as tf
a = tf.linspace(1.0, 5.0, 5) #1.起始值10 2.結束值13 3.數量是4
with tf.Session() as sess:
print(sess.run(a))
輸出:
[1. 2. 3. 4. 5.]
(2)tf.range:建立數字序列
語法:tf.range(start, limit=None, delta=1, dtype=None,name='range')
import tensorflow as tf
a = tf.range(0,10,1) #1.從0開始 2.10以前 3.公差是1
b = tf.range(10) #10是限制
#因為(start=0, limit=None, delta=1, dtype=None, name='range'),所以起點0和公差1都有預設了
#所以a,b相同
with tf.Session() as sess:
print(sess.run(a))
print(sess.run(b))
輸出:
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
4.隨機產生常量:
語法:tf.random_normal (shape, mean=0.0, stddev=1.0, dtype=tf.float32,seed=None, name=None)
import tensorflow as tf
a = tf.random_normal([3,4],10,2,tf.float64,1)
#1. 3*4矩陣2.平均是10 3.標準差是2 4. 64位浮點數
#5.seed:是一個整數,設定後,每次生成的隨機數都一樣
b = tf.random_normal([3,4],10,2,tf.float64,1)
c = tf.random_normal([3,4],10,2,tf.float64,2)
with tf.Session() as sess:
print(sess.run(a))
print(sess.run(b)) #會發現seed相同時,生出的隨機數都一樣
print('*'*40)
print(sess.run(c))
輸出:
[[10.48565509 9.29400356 8.32698442 9.51286196]
[13.82013658 9.26140554 10.72015467 6.56759923]
[11.3093726 8.49358633 10.32934506 7.97655564]]
[[10.48565509 9.29400356 8.32698442 9.51286196]
[13.82013658 9.26140554 10.72015467 6.56759923]
[11.3093726 8.49358633 10.32934506 7.97655564]]
****************************************
[[ 7.40522701 10.13930217 9.16300271 10.90471891]
[10.83600015 9.42317886 8.31473349 10.29167639]
[ 9.93777917 13.99150225 9.07006875 10.04976989]]
下圖JOHN國的房價,JOHN國的房價很簡單,只受到坪數大小的影響。
id | price | sqft_living
------------- | ----------
1 | 500000 | 55
2 | 275000 | 27
3 | 360000 | 33
4 | 780000 | 70
5 | 145000 | 13
6 | 280000 | 26
7 | 860000 | 89
8 | 200000 | 21
9 | 90000 | 10
10 | 680000 | 67
這是【Day 04】超級基礎的機器學習-Linear Regression 介紹(1/2)曾經示範過的,輪到你們試試看啦!
試著把那條線找出來吧!
有幾個地方是理念我有提到,但是函式庫沒有提到,先給大家我在做的時候沒有提到的函式庫:
1.loss function:loss = tf.reduce_mean(tf.square(y - ys)) #我的y是預測值;ys是data
2.優化器:optimizer = tf.train.GradientDescentOptimizer() #括號裡面填上學習率
3.最小化的code寫法: optimizer.minimize(loss)
其他幾乎都是有提到的函式庫,讓你們試試看囉!
明天會公布我的作法,當然出來結果不一定是最好的,如果更換loss算法、更換優化器、改變參數,甚至是想辦法讓data變多等等,都有機會讓結果更好,讓大家試試看囉!