从 TensorFlow 入门机器学习
寫在前面:緊跟時代步伐,開始學習機器學習,抱著爭取在畢業之前多看看各個方向是什么樣子的心態,發現這是一個很有潛力也很有趣的領域(keng)。// 然后就開始補數學了……
0 TensorFlow 介紹
剛剛入門的小白,理解不深,直接看官方的介紹吧
GitHub Description: Computation using data flow graphs for scalable machine learning
官網: 是一個使用數據流圖進行數值計算的開源軟件庫。圖中的節點代表數學運算, 而圖中的邊則代表在這些節點之間傳遞的多維數組(張量)。
0.1 什么是 TensorFlow ?
是張量的意思, 是流的意思。所以可以直接看做利用張量組成的數據流圖進行計算的一個開源庫。
0.2 TensorFlow 可以做什么 ?
目前主要是用于機器學習,這樣說有點不親民,筆者理解是可以將數據轉化為向量描述并且構建相應的計算流圖都是可以使用的。 舉個例子吧,雖然不知道恰不恰當。 比如我們在計算 時,可以構建一個二叉樹
這棵二叉樹的中序遍歷就是上面的表達式,也就是說這個表達式可以轉化成一個形如二叉樹的圖,而 正好可以計算這個圖。下面給出代碼,看不懂沒關系,只要理解代碼流程是對圖(二叉樹)的計算就可以了,下一章會介紹如何使用。
# coding: utf-8 import tensorflow as tfa, b, c, d = tf.constant(1), tf.constant(2), tf.constant(3),tf.constant(4) add = tf.add(a,b) mul = tf.multiply(add, c) sub = tf.subtract(mul, d) with tf.Session() as sess:print(sess.run(sub)) # output: # 5 復制代碼0.3 TensorFlow 安裝
這里就不做詳細介紹了,相信點開這篇文章的你應該有了運行環境。如果沒有這里推薦兩個網站英文:官網 和 中文:**學院翻譯 然后介紹一下我的環境:
注意 設置為 才能跑 。如果不會可以多看看網上的教程,能對虛擬環境加深了解。
1 初識 TensorFlow
好了,有前面的介紹,你應該有能夠使用 的環境了,下面開始介紹如何編碼。
1.1 基礎語法
其實說語法是不準確的,語法就是 的語法(這里使用 Python),主要是介紹調用這個計算庫來實現這個特殊的計算。同樣擺上官網教程
1.1.1 計算單元介紹
可以看到在計算圖中,有兩個主要的內容是點(葉子和非葉子節點)和線。我的理解是點代表數據,線代表操作。不知道對不對,不過下面就按照這樣思路介紹了。 下面開始介紹有哪些常用的“點”:
常量
c = tf.constant(2) 復制代碼變量
v = tf.Variable(2) 復制代碼占位符
p = tf.placeholder(tf.float32) 復制代碼以上代碼都是以最小能用原則傳的參,感興趣的可以去看看源碼,這里主要是往 語法上拉,先使用起來再以后自己深究為什么要設計成這樣的數據結構對計算圖是必須的。
接下來就是有哪些“線”:
四則運算
add = tf.add(a, b) sub = tf.subtract(a, b) mul = tf.multiply(a, b) div = tf.divide(a, b) 復制代碼其他的就不再介紹了,詳情可看 的源碼。比如以上的操作定義在 。
1.1.2 計算流程介紹
知道了常見數據和計算方法下面介紹計算流程:
# coding: utf-8 import tensorflow as tf# Step1: 創建數據 a, b, c, d = tf.constant(1), tf.constant(2), tf.constant(3),tf.constant(4)# Step2: 構造計算圖 add = tf.add(a,b) mul = tf.multiply(add, c) sub = tf.subtract(mul, d)# Step3: 進行計算 with tf.Session() as sess:print(sess.run(sub)) 復制代碼上面這個例子是一個標準的常量計算過程,你可以試著 print(a, add) 看看你創建的是個什么東西,你會發現他是一個 而且里面的值是 。可以猜測,這里只打印不計算,看 源碼:
# ops.py def __repr__(self):return "<tf.Tensor '%s' shape=%s dtype=%s>" % (self.name, self.get_shape(),self._dtype.name) def name(self):"""The string name of this tensor."""if not self._op.name:raise ValueError("Operation was not named: %s" % self._op)return "%s:%d" % (self._op.name, self._value_index) 復制代碼學會了計算常量,變量是不是也一樣?如果你試過就知道是不一樣的,變量需要初始化操作。
v = tf.Variable(2) with tf.Session() as sess:sess.run(tf.global_variables_initializer())print(v, sess.run(v)) 復制代碼到這里可能會疑問,那變量和常量有什么區別?從字面意思可以知道變量應該是可變的,方便我們在計算過程中隨時調整參數,下面通過一段代碼介紹如何使用。
v = tf.Variable(2) # 將 v 的值自乘 2 update = tf.assign(v, tf.multiply(v, tf.constant(2))) with tf.Session() as sess:sess.run(tf.global_variables_initializer())for _ in range(4):print("-----------------------")print "Before : ", sess.run(v)sess.run(update)print "After : ", sess.run(v)# output: # ----------------------- # Before : 2 # After : 4 # ----------------------- # Before : 4 # After : 8 # ----------------------- # Before : 8 # After : 16 # ----------------------- # Before : 16 # After : 32 復制代碼但是如果我們不想每次都設置-更新-計算-更新-計算……而是直接把數據寫入計算,那占位符就起作用了。同樣舉個小例子。
c = tf.constant(2) # 注意類型一致,這里是 tf.int32 p = tf.placeholder(tf.int32) mul = tf.multiply(c, p) with tf.Session() as sess:# tmp = 2 相當于上一個例子變量的初始值是 2tmp = 2;for _ in range(4):# 直接填充 feed_dicttmp = sess.run(mul, feed_dict={p:tmp})print tmp# output: # 4 # 8 # 16 # 32 復制代碼下面總結下計算過程:
- 創建數據:可以創建常量、變量和占位符。
- 構建圖:通過前面的數據構建一張圖。
- 初始化:把變量初始化。
- 計算:必須通過開啟一個 Session 來計算圖
1.2 可視化
提供了一個可視化工具——,下面開始介紹如何使用。
這里對上面二叉樹的例子進行可視化處理。
# coding: utf-8 import tensorflow as tfa, b, c, d = tf.constant(1), tf.constant(2), tf.constant(3),tf.constant(4) add = tf.add(a,b) mul = tf.multiply(add, c) sub = tf.subtract(mul, d) with tf.Session() as sess:writer = tf.summary.FileWriter('./graphs', sess.graph)print(sess.run(sub)) writer.close() 復制代碼然后使用命令行到存儲 graphs 的文件夾下執行 tensorboard --logdir="./graphs" 命令,然后按照提示在瀏覽器中打開 http://localhost:6006 如果成功顯示 界面就說明成功了。
2 利用 TensorFlow 進行機器學習
這里也算是機器學習的入門介紹吧。直接介紹機器學習相關知識可能不太現實,而且筆者也是在學習階段,所以舉一些小例子來體會機器學習的過程吧。
2.1 線性回歸
這里我們使用最熟悉的線性回歸來體會一下機器學習的過程:
2.1.1 準備數據
這里很簡單,就是模擬一個線性回歸,所以我們直接自己擬定一些數據好預測結果和自己設想的是否一致。
train_X = numpy.asarray([1.1, 1.8, 3.2, 4.7, 5.9, 6.7]) train_Y = numpy.asarray([1.2, 2.1, 3.1, 4.6, 5.5, 6.9]) 復制代碼2.1.2 構建模型
我們采用占位符的形式進行計算,在運算時直接導入數據便可。 這里因為我們采用線性回歸,所以目標函數是形如 的形式的一次函數。也就是說,我們通過給出的點去擬合一條比較符合這些點分布的直線。
X = tf.placeholder(tf.float32) Y = tf.placeholder(tf.float32)W = tf.Variable(-1., name="weight") b = tf.Variable(-1., name="bias")# linear model # activation = X*W + b activation = tf.add(tf.multiply(X, W), b) 復制代碼2.1.3 參數評估
我們采用每個點給出的縱坐標和線性模型算出的縱坐標的差的平方和作為損失函數,在訓練中采用梯度下降算法盡量使和最小,學利率選擇 。其中的數學原理這里就不介紹了,以后會寫關于機器學習算法的相關文章。 一般選取損失函數和通過某些最優化手段更新權重是這里的一大難點,如果要知道原理,需要學習大量數學基礎知識(概率論,線性代數,微積分……)。
learning_rate = 0.01cost = tf.reduce_sum(tf.pow(activation - Y, 2)) optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 復制代碼2.1.4 訓練數據
這里就是取數據,喂給圖中的輸入節點,然后模型會自己進行優化,可以將數據多次迭代使得擬合函數能夠更好的適應這些數據點。
training_epochs = 2000 display_step = 100with tf.Session() as sess:sess.run(tf.global_variables_initializer())for epoch in range(training_epochs):for (x, y) in zip(train_X, train_Y):sess.run(optimizer, feed_dict={X: x, Y: y})if epoch % display_step == 0:print("Epoch:", '%04d' % (epoch + 1), "cost=","{:.9f}".format(sess.run(cost, feed_dict={X: train_X, Y: train_Y})), "W=", sess.run(W), "b=",sess.run(b))print("Optimization Finished!")print("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b)) 復制代碼2.1.5 可視化
可以直接繪制二維圖形看結果。不熟悉的可以參考Matplotlib 教程
writer = tf.summary.FileWriter('./graphs', sess.graph)plt.scatter(train_X, train_Y, color='red', label='Original data')plt.plot(train_X, sess.run(W) * train_X + sess.run(b), color='blue', label='Fitted line')plt.show() writer.close() 復制代碼二維圖:
數據流圖:2.1.6 小結
其實整個過程如果不深究其中的原理,還是很好理解的,無非就是提供數據-選取擬合函數-構建圖-選取損失函數-最優化-訓練數據(更新權重)-得出結論。這個過程符合我們對線性回歸這個問題解決的基本思路的預期。當然,筆者認為這只是開始,要想深入,學習必要的數學知識是機器學習的必經之路。
這里可以參考TensorFlow 入門 整體代碼:
# coding: utf-8 from __future__ import print_function import tensorflow as tf import numpy import matplotlib.pyplot as plttrain_X = numpy.asarray([1.1, 1.8, 3.2, 4.7, 5.9, 6.7]) train_Y = numpy.asarray([1.2, 2.1, 3.1, 4.6, 5.5, 6.9])X = tf.placeholder(tf.float32) Y = tf.placeholder(tf.float32)W = tf.Variable(-1., name="weight") b = tf.Variable(-1., name="bias")activation = tf.add(tf.multiply(X, W), b)learning_rate = 0.01cost = tf.reduce_sum(tf.pow(activation - Y, 2)) optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)training_epochs = 2000 display_step = 100with tf.Session() as sess:sess.run(tf.global_variables_initializer())for epoch in range(training_epochs):for (x, y) in zip(train_X, train_Y):sess.run(optimizer, feed_dict={X: x, Y: y})if epoch % display_step == 0:print("Epoch:", '%04d' % (epoch + 1), "cost=","{:.9f}".format(sess.run(cost, feed_dict={X: train_X, Y: train_Y})), "W=", sess.run(W), "b=",sess.run(b))print("Optimization Finished!")print("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))writer = tf.summary.FileWriter('./graphs', sess.graph)plt.scatter(train_X, train_Y, color='red', label='Original data')plt.plot(train_X, sess.run(W) * train_X + sess.run(b), color='blue', label='Fitted line')plt.show() writer.close()# output: # Epoch: 0001 cost= 0.785177052 W= 1.07263 b= -0.448403 # Epoch: 0101 cost= 0.440001398 W= 1.02555 b= -0.0137608 # Epoch: 0201 cost= 0.437495589 W= 1.02078 b= 0.0176154 # Epoch: 0301 cost= 0.437433660 W= 1.02043 b= 0.0199056 # Epoch: 0401 cost= 0.437430561 W= 1.02041 b= 0.0200727 # Epoch: 0501 cost= 0.437429130 W= 1.0204 b= 0.0200851 # Epoch: 0601 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 0701 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 0801 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 0901 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1001 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1101 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1201 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1301 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1401 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1501 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1601 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1701 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1801 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1901 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Optimization Finished! # cost= 0.43743 W= 1.0204 b= 0.0200854 # 可以看到迭代次數到 500 次左右數據就穩定了。 復制代碼3 總結
其實這只是一個開始,還有好多好多東西要去學習。越來越覺得基礎的重要性,不僅僅是計算機基礎,數學基礎也是同等重要,特別是未來的物聯網趨勢,可能編碼這種專業越來越淡化,只是作為某些專業人員的一種工具/技能使用。馬上面臨畢業,只能自己慢慢啃這些東西了……
4 參考資料
- 0. 官網
- 1. 中文:**學院翻譯
- 2. Matplotlib 教程
- 3. TensorFlow 入門
總結
以上是生活随笔為你收集整理的从 TensorFlow 入门机器学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zookeeper无故挂掉,启动不起来的
- 下一篇: rem布局