Tensorflow lesson 1---第一個機器學習的代碼

神經網絡,機器學習,可以說是現在最流行的計算機技術,TensorFlow是谷歌開源的機器學習框架,聽起來就很高大上,很難學習,不幸的是國內的一些教程都是原文翻譯谷歌官方教程,非常難以學習,所以本系列教程就是用比較容易懂的語言來教大傢什麼tensorflow。

首先tensorflow是一個深度學習的框架,其定義了一套神經網絡機制,是用戶可以在這套神經網絡上開發自己的深度學習模型,進行機器學習。

說的通俗一點tensorflow就是一套神經網絡的編程框架,和java中的各種框架一個概念,只是他是用來開發深度學習的框架。其正真複雜的東西是如何在這套框架的基礎上設計深度學習的模型,比如現在的CNN卷積神經網絡,RNN循環神經網絡,這都是深度學習模型,都是基於神經網絡開發出來的模型。

所以大家學習的時候,不應該把tensorflow看做是多麼高大上的東西,而把他看做一種深度學習的編程框架,這樣更容易學習,而真正高大上的是那些包含了很多數學知識的模型。這套教程我們就用簡單易懂的語言來介紹tensorflow。課程中所有的示例代碼都是基於python3,和tensorflow 1.1
下面我們來介紹一下幾個基本的概念

  • 唯一的數據表達結構tensor:tensorflow中只有一種數據結構tensor表達數據,tensor的中文意思是張量,不懂的要去複習一下高等數學,線性代數。也就是說tensorflow的作用就是來對tensor來進行處理的,而不是傳統的int,float,double數據類型,當然tensor中的元素的數據類型則可以是int,float等,不管你做什麼處理,都要構造成tensor才能被tensorflow所處理,即使是一個簡單整形數字

  • 變量:tensorflow中也有變量就如同我們傳統編程中使用的變量一樣,他是通過tf.Variable來定義的,其在使用過程中是可以被修改的,經常會被用做需要訓練得出的結果,比如 y=wx+b,我們給定一組y,和x,我們希望神經網絡能夠學習其中的規律,得出w,和b應該是多少,這時候我們一般就 會把w,和b定義成變量,讓神經網絡不斷的糾正w,和b

W=tf.Variable([.3],tf.float32)
b=tf.Variable([-.3],tf.float32)
x=tf.placeholder(tf.float32)
linear_model=W*x+b
  • 常量:tensorflow中的常量是用tf.constant來定義的,顧名思義常量定義後是不可以修改的,和我們傳統開發語言中的常量是一樣的概念
node1 = tf.constant(3.0, tf.float32)  # create a constant
node2 = tf.constant(4.0)

如上我們聲明瞭兩個常量,在使用過程中就不能再被修改了

  • placeholder:就是tensorflow中的輸入參數,可以在使用過程中重新賦值
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
  • optimizer:tensorflow學習的過程,就是把實際的結果和神經網絡計算出來的結果做比較,使得計算結果不斷的逼近實際的結果,這其中就涉及到一個優化器的概念,每次計算完以後都用優化器來來優化,不斷逼近,其本質上就是按照某種算法不斷的調整參數,如上面講到的例子y=wx+b,就是不斷的修正w和b,這就是訓練的過程。

下面我就用前面介紹的概念來設計一個簡單的機器學習模型,有助於大家根據直觀的理解

第一個機器學習的tensorflow代碼
如下這段代碼是一個完整的機器學習過程,這段代碼在給定x=[1,2,3,4]情況下y=[0,-1,-2,-3],讓機器學習y= Wx + b的方程中W和b應該是多少。

import tensorflow as tf
import numpy as np

sess = tf.Session()#初始化一個session,tensorflow中所有的運算都是通過session來實現的

W=tf.Variable([.3],tf.float32)#聲明W變量
b=tf.Variable([-.3],tf.float32)#聲明b變量
x=tf.placeholder(tf.float32)#聲明x作爲輸入參數,在訓練的時候可以給定訓練值
linear_model=W*x+b#聲明迴歸模型y=Wx+b
init=tf.global_variables_initializer()#初始化所有變量

y=tf.placeholder(tf.float32)#聲明y作爲輸入產生,在訓練的時候可以給定訓練值
squared_deltas=tf.square(linear_model-y)#計算程序計算的值和實際值的差異
loss=tf.reduce_sum(squared_deltas)#累積誤差

optimizar =tf.train.GradientDescentOptimizer(0.01)#定義優化器
train=optimizar.minimize(loss)#設定優化器是使誤差越來越小
sess.run(init)#初始化
for i in range(1000):#訓練1000次
    sess.run(train,{x:[1,2,3,4],y:[0,-1,-2,-3]})
    if i%20==0:#每訓練20次,打印這時候的W和b
        print(i,sess.run(W),sess.run(b))

執行這段訓練模型會得到如下的輸出:

0 [-0.21999997] [-0.456]
20 [-0.58761531] [-0.21246126]
40 [-0.67591733] [ 0.04715736]
60 [-0.74531162] [ 0.25118509]
80 [-0.79984683] [ 0.41152528]
100 [-0.84270465] [ 0.53753263]
120 [-0.87638563] [ 0.63655871]
140 [-0.90285456] [ 0.71438056]
160 [-0.92365587] [ 0.77553892]
180 [-0.94000298] [ 0.82360154]
200 [-0.95284992] [ 0.86137295]
220 [-0.96294594] [ 0.89105648]
240 [-0.97088015] [ 0.91438407]
260 [-0.97711545] [ 0.93271655]
280 [-0.98201561] [ 0.94712371]
300 [-0.98586655] [ 0.95844597]
320 [-0.98889291] [ 0.96734387]
340 [-0.99127126] [ 0.97433633]
360 [-0.99314034] [ 0.97983164]
380 [-0.99460912] [ 0.98415017]
400 [-0.99576342] [ 0.98754394]
420 [-0.9966706] [ 0.99021119]
440 [-0.99738348] [ 0.99230719]
460 [-0.99794376] [ 0.99395436]
480 [-0.99838412] [ 0.99524909]
500 [-0.99873012] [ 0.99626648]
520 [-0.99900204] [ 0.99706584]
540 [-0.99921572] [ 0.99769413]
560 [-0.99938363] [ 0.9981879]
580 [-0.99951565] [ 0.99857605]
600 [-0.99961936] [ 0.99888098]
620 [-0.9997009] [ 0.99912065]
640 [-0.99976492] [ 0.99930882]
660 [-0.99981529] [ 0.99945682]
680 [-0.9998548] [ 0.99957311]
700 [-0.99988592] [ 0.9996646]
720 [-0.9999103] [ 0.99973637]
740 [-0.99992955] [ 0.99979281]
760 [-0.99994463] [ 0.99983722]
780 [-0.99995649] [ 0.99987203]
800 [-0.99996579] [ 0.99989945]
820 [-0.99997312] [ 0.9999209]
840 [-0.99997884] [ 0.99993783]
860 [-0.99998337] [ 0.99995112]
880 [-0.99998695] [ 0.99996156]
900 [-0.99998969] [ 0.99996972]
920 [-0.99999189] [ 0.99997616]
940 [-0.99999362] [ 0.99998128]
960 [-0.99999499] [ 0.99998528]
980 [-0.99999613] [ 0.99998856]

從輸出的結果可以看出,整個訓練就是一個不斷逼近的過程,當最後訓練完的時候,W和b已經非常逼近實際的值了,精度是非常高的。

這段代碼雖然是非常簡單的一段機器學習的代碼,但實際上所有的機器學習都遵循這樣一個過程。

示例程序請關注http://www.diegorobot.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章