劉玉坤,邢立國
(平頂山學(xué)院計算機學(xué)院(軟件學(xué)院),平頂山 467000)
在這個人工智能的時代,作為一個有理想抱負的程序員,或者學(xué)生、愛好者,不懂深度學(xué)習(xí)這個超熱的話題,似乎已經(jīng)跟時代脫節(jié)了[1]。深度學(xué)習(xí)目前已經(jīng)成為了人工智能領(lǐng)域的突出話題。它因在“自然語言處理”、“人機博弈”、“語音識別”的卓越表現(xiàn)而聞名,甚至為人類所不及。當今對深度學(xué)習(xí)的關(guān)注度也在不斷攀升。在諸多深度學(xué)習(xí)系統(tǒng)中,TensorFlow是一款最受歡迎學(xué)習(xí)系統(tǒng)[2]。在本文介紹了TensorFlow,描述了一個線性回歸的案例及其Python實現(xiàn)。
TensorFlow是2015年11月9日谷歌推出的開源機器學(xué)習(xí)框架,TensorFlow是由Jeff Dean為首的開發(fā)團隊由第一代深度學(xué)習(xí)系統(tǒng)DistBilief改進而來的。但是對于大規(guī)模的神經(jīng)網(wǎng)絡(luò)訓(xùn)練要求更大的部署空間,DistBilief已力不從心,TensorFlow允許用戶通過賦值和并行執(zhí)行一個核心的模型數(shù)據(jù)流圖來輕松實現(xiàn)多種并行度。其可以由許多不同的計算設(shè)備協(xié)作來更新一套共享參數(shù)或者其他狀態(tài)。因此好多用戶已經(jīng)轉(zhuǎn)向TensorFlow。這些用戶依靠TensorFlow進行研究和生產(chǎn),其任務(wù)多種多樣,例如在手機上運行計算機視覺模型的推理,以及使用數(shù)百個示例記錄對數(shù)千億個參數(shù)進行深層神經(jīng)網(wǎng)絡(luò)的大規(guī)模訓(xùn)練。TensorFlow已經(jīng)成為世界上最受歡迎的開源機器學(xué)習(xí)框架,它支持的語言有C++、Python,它具有快速、靈活并適合產(chǎn)品級大規(guī)模應(yīng)用等特點,同時TensorFlow也支持多系統(tǒng),主要的支持系統(tǒng)有 Linux、Mac OS X、Windows等,TensorFlow讓每個開發(fā)者和研究者都能方便地使用人工智能來解決多樣化的挑戰(zhàn)[3]。
在神經(jīng)網(wǎng)絡(luò)中,分類網(wǎng)絡(luò)的最終層通常包含某種形式的邏輯回歸算法,用于將連續(xù)數(shù)據(jù)轉(zhuǎn)換為形如0和1的虛擬變量(例如,在飛行員的選拔中,根據(jù)一些學(xué)生的身高、體重和健康情況判斷他們是否合格),而真正意義上的回歸算法則用于將一組連續(xù)的輸入映射至另一組連續(xù)的輸出[3]。描述兩個變量x和y之間關(guān)系的簡單線性回歸模型可以用下面的方程表示y=a+bx+e,數(shù)字a和b稱為參數(shù),e是誤差項。在本次討論中為了簡化模型。設(shè)計線性模型如下,假設(shè)一個模型的輸入y和xi滿足一下關(guān)系,y=+b,模型的輸出為輸入的加權(quán)和。下面通過TensorFlow來實現(xiàn)一元的線性回歸模型的訓(xùn)練,通過訓(xùn)練數(shù)據(jù),推測出線性回歸函數(shù)(y=w*x+b)中w和b的值,并通過驗證數(shù)據(jù),驗證得到的函數(shù)是否符合預(yù)期。
(1)模塊引入
模塊是Python中的一個重要概念,Python的程序是由一個個模塊組成的。在使用一個模塊的函數(shù)或類之前,首先要導(dǎo)入該模塊[4]。首先引入TensorFlow模塊,為了清晰了解訓(xùn)練結(jié)果,引入繪圖表,引入測試數(shù)據(jù)模塊(此模塊代碼從略)。
import tensorflow as tf matplotlib.pyplot as pyp testdata as td
(2)得到訓(xùn)練數(shù)據(jù)
通過testData來模擬第三方接口,getTrainData得到訓(xùn)練數(shù)據(jù)參數(shù):dataLength(得到數(shù)據(jù)的個數(shù)),返回值:二維數(shù)組[0]代表 x(橫坐標),[1]代表 y(縱坐標),getValidateData得到驗證數(shù)據(jù)參數(shù):dataLength得到數(shù)據(jù)的個數(shù)。
trainData=td.getTrainDate(200)
practice_x=[v[0]for v in trainData]
practice_y=[v[1]for v in trainData]
(3)構(gòu)造預(yù)測的線性回歸函數(shù)y=W*x+b
W=tf.Variable(tf.random_uniform([1]))
b=tf.Variable(tf.zeros([1]))
y=W*practice_x+b
cost=tf.reduce_mean(tf.square(y-practice_y))
(5)參數(shù)優(yōu)化。學(xué)習(xí)率(learning_rate)可理解為每一次梯度下降的步長,一般設(shè)置學(xué)習(xí)率小于0.1,此處我們設(shè)置為0.08。當學(xué)習(xí)率過大時,可能導(dǎo)致參數(shù)在最低點附近來回震蕩,始終到達不了最優(yōu)點;當學(xué)習(xí)率過小時,前期梯度下降的速度極其慢,浪費時間。所以最優(yōu)的方法是前期學(xué)習(xí)率設(shè)置大點,讓梯度迅速下降,隨后慢慢將學(xué)習(xí)率減小,以求達到最優(yōu)點[5]。深度學(xué)習(xí)常見的是對于梯度的優(yōu)化,也就是說,優(yōu)化器最后其實就是各種對于梯度下降算法的優(yōu)化。在本程序中我們使 用 了 tf.GradientDescentOptimizer(learning_rate)函數(shù)。一般在上面這個函數(shù)的后面還會加一個最小化代價函數(shù),構(gòu)成深度學(xué)習(xí)中的訓(xùn)練對象。在TensorFlow中調(diào)整假設(shè)函數(shù),使用梯度下降算法找最優(yōu)解。
optimizer=tf.train.GradientDescentOptimizer(0.08)train=optimizer.minimize(cost)
with tf.Session()as sessio∶#初始化所有變量值
init=tf.global_variables_initializer()
sessio.run(init) #初始化W和b的值
print("cost=",sessio.run(cost),"W=",sessio.run(W),"b=",sessio.run(b))
for k in range(500)∶#循環(huán)運行
sessio.run(train)
print("cost=",sessio.run(cost),"W=",sessio.run(W),"b=",sessio.run(b))輸出 W 和 b
print("訓(xùn)練完成")
pyp.plot(practice_x,practice_y,'ro',label='train data')#構(gòu)造圖形結(jié)構(gòu)
pyp.plot(practice_x,sessio.run(y),label='tain result')
pyp.legend()
pyp.show()
該程序運行的結(jié)果效果如圖1所示。通過圖像顯示,使用TensorFlow進行線性回歸模擬求解很好地實現(xiàn)一次函數(shù)的參數(shù)模擬求解,并且使用該一次函數(shù)求值并且加上隨機誤差的點均勻地分布在直線附近。非常直觀,見圖1:
圖1 效果模擬圖
本文首先介紹了TensorFlow,之后給出了線性回歸的基本概念并利用TensorFlow實現(xiàn)了該模型,該算法可用于解決實際工作中的一些相關(guān)問題,具有一定的實際意義。掌握深度學(xué)習(xí)需要較強的理論功底,用好TensorFlow又需要足夠的實踐和解析。用TensorFlow實現(xiàn)的程序則有助于讀者更好地理解和把握該Tensor-Flow的基本思想和一個模型實現(xiàn)過程。本文能夠為入門級的讀者帶來一個全新的體驗。