這篇文章主要介紹了Python如何通過TensorFLow進行線性模型訓(xùn)練原理,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
專業(yè)領(lǐng)域包括網(wǎng)站設(shè)計制作、成都網(wǎng)站制作、成都做商城網(wǎng)站、微信營銷、系統(tǒng)平臺開發(fā), 與其他網(wǎng)站設(shè)計及系統(tǒng)開發(fā)公司不同,成都創(chuàng)新互聯(lián)公司的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。例如要從一個線性分布的途中抽象出其y=kx+b的分布規(guī)律
特征是輸入變量,即簡單線性回歸中的 x
變量。簡單的機器學(xué)習(xí)項目可能會使用單個特征,而比較復(fù)雜的機器學(xué)習(xí)項目可能會使用數(shù)百萬個特征。
標簽是我們要預(yù)測的事物,即簡單線性回歸中的 y
變量。
樣本是指具體的數(shù)據(jù)實例。有標簽樣本是指具有{特征,標簽}的數(shù)據(jù),用于訓(xùn)練模型,總結(jié)規(guī)律。無標簽樣本只具有特征的數(shù)據(jù)x,通過模型預(yù)測其y值。
模型是由特征向標簽映射的工具,通過機器學(xué)習(xí)建立。
訓(xùn)練是指模型通過有標簽樣本來學(xué)習(xí),確定其參數(shù)的理想值。通俗理解就是在給出一些樣本點(x,y),總結(jié)其規(guī)律確定模型y=kx+b中的兩個參數(shù)k、b,進而利用這個方程,在只給出x的情況下計算出對應(yīng)的y值。
損失是一個數(shù)值,用于表示對于單個樣本而言模型預(yù)測的準確程度。預(yù)測值與準確值相差越大,損失越大。檢查樣本并大限度地減少模型損失的過程叫做經(jīng)驗風(fēng)險最小化。L1損失是標簽預(yù)測值與實際值差的絕對值。平方損失是樣本預(yù)測值與實際值的方差。
模型的訓(xùn)練是一個迭代的過程,首先對模型的參數(shù)進行初始參數(shù),得到一個初步模型并計算出特征對應(yīng)的標簽值,然后經(jīng)過比對計算出損失。之后對模型的參數(shù)進行調(diào)整,之后再進行預(yù)測、計算損失,如此循環(huán)直到總損失不再變化或變化很緩慢為止,這時稱該模型已經(jīng)收斂。
類似于對于一個二次函數(shù),通過不斷調(diào)整x的值,找到其函數(shù)的極值點,在該點處函數(shù)的變化率為0。那么如何找到極值點,可以采用梯度下降法,即對于函數(shù)曲線,朝著其梯度值減少的方向(負梯度)探索便可以最快找到極值點。
前向傳播:根據(jù)輸入計算輸出值。反向傳播:根據(jù)優(yōu)化器算法計算內(nèi)部變量的調(diào)整幅度,從輸出層級開始,并往回計算每個層級,直到抵達輸入層。
在梯度下降法中,批量是指單次迭代中用于計算梯度的樣本數(shù)。隨機梯度下降法是指每次隨機選擇一個樣本進行梯度計算。
那么朝探索的方向前進多少比較合適?這就涉及到學(xué)習(xí)速率,用梯度乘以學(xué)習(xí)速率就得到了下一個點的位置,也叫做步長,如果步長過小,那么可能需要許多次才可到達目標點,如果步長過大,則可能越過目標點。
這種參數(shù)需要人為在學(xué)習(xí)之前設(shè)置參數(shù),而不是通過訓(xùn)練得到的參數(shù),這種參數(shù)叫做超參數(shù)。超參數(shù)是編程人員用于對機器學(xué)習(xí)進行調(diào)整的旋鈕。
通過Tensor FLow進行訓(xùn)練的步驟主要有:準備數(shù)據(jù)、構(gòu)建模型、訓(xùn)練模型、進行預(yù)測
使用的數(shù)據(jù)可以是從生活中的數(shù)據(jù)經(jīng)過加工而來,也可以是人工生成的數(shù)據(jù)集,例如產(chǎn)生y=2x+1附近的隨機數(shù)點:
#在jupyter中設(shè)置圖像的顯示方式inline,否則圖像不顯示 %matplotlib inline import tensorflow as tf import numpy as np #Python的一種開源的數(shù)值計算擴展 import matplotlib.pyplot as plt #Python的一種繪圖庫 np.random.seed(5) #設(shè)置產(chǎn)生偽隨機數(shù)的類型 x=np.linspace(-1,1,100) #在-1到1之間產(chǎn)生100個等差數(shù)列作為圖像的橫坐標 #根據(jù)y=2*x+1+噪聲產(chǎn)生縱坐標 #randn(100)表示從100個樣本的標準正態(tài)分布中返回一個樣本值,0.4為數(shù)據(jù)抖動幅度 y=2*x+1.0+np.random.randn(100)*0.4 plt.scatter(x,y) #生成散點圖 plt.plot(x,2*x+1,color='red',linewidth=3) #生成直線y=2x+1
在jupyter中繪制出了人工數(shù)據(jù)的散點圖與曲線如下:
#定義函數(shù)模型,y=kx+b def model(x,k,b): return tf.multiply(k,x)+b #定義模型中的參數(shù)變量,并為其賦初值 k=tf.Variable(1.0,name='k') b=tf.Variable(0,name='b') #定義訓(xùn)練數(shù)據(jù)的占位符,x為特征值,y為標簽 x=tf.placeholder(name='x') y=tf.placeholder(name='y') #通過模型得出特征值x對應(yīng)的預(yù)測值yp yp=model(x,k,b)
k、b的初始值并不會影響最終結(jié)果的得到,所以可以隨意指定一個值。
#訓(xùn)練模型,設(shè)置訓(xùn)練參數(shù)(迭代次數(shù)、學(xué)習(xí)率) train_epoch=10 rate=0.05 #定義均方差為損失函數(shù) loss=tf.reduce_mean(tf.square(y-yp)) #定義梯度下降優(yōu)化器,并傳入?yún)?shù)學(xué)習(xí)率和損失函數(shù) optimizer=tf.train.GradientDescentOptimizer(rate).minimize(loss) ss=tf.Session() init=tf.global_variables_initializer() ss.run(init) #進行多輪迭代訓(xùn)練,每輪將樣本值逐個輸入模型,進行梯度下降優(yōu)化操作得出參數(shù),繪制模型曲線 for _ in range(train_epoch): for x1,y1 in zip(sx,sy): ss.run([optimizer,loss],feed_dict={x:x1,y:y1}) tmp_k=k.eval(session=ss) tmp_b=b.eval(session=ss) plt.plot(sx,tmp_k*sx+tmp_b) ss.close()
迭代次數(shù)是人為規(guī)定模型要訓(xùn)練的次數(shù)。學(xué)習(xí)率不能太大或太小,根據(jù)經(jīng)驗一般設(shè)置在0.01到0.1之間
采用均方差為損失函數(shù),square求出y-yp的平方,再通過reduce_mean()求出平均值
再將之前人工生成的數(shù)據(jù)輸入到占位符時,通過zip()函數(shù)先將每個sx,sy對應(yīng)壓縮為一個二維數(shù)組,然后對100個二維數(shù)組進行遍歷取出并分別填充到占位符x、y,使會話運行優(yōu)化器optimizer進行迭代訓(xùn)練。
可以看到運行結(jié)果如下,預(yù)測的曲線慢慢向分布的散點進行擬合
根據(jù)函數(shù)模型,y=kx+b,將得到的參數(shù)k、b和特質(zhì)值x帶入即可得到標簽y的預(yù)測值
Numpy是一個支持大量的維度數(shù)組與矩陣運算的python庫,通過它可以很便捷地將數(shù)據(jù)轉(zhuǎn)換為數(shù)組并進行操作。np類型的shape屬性可以輸出數(shù)組的維數(shù)構(gòu)成??梢酝ㄟ^np.T對數(shù)組進行轉(zhuǎn)置,或者np.rashape(3,2)將數(shù)組轉(zhuǎn)換為目標形狀。例子如下
scalar=1 scalar_np=np.array(scalar) #將標量轉(zhuǎn)化為np的數(shù)組類型 print(scalar_np.shape) #只有np才有shape屬性,標量對應(yīng)的shape輸出為() #二維以上的有序數(shù)組才可以看作矩陣 matrix=[[1,2,3],[4,5,6]] matrix_np=np.array(matrix) #將list轉(zhuǎn)化為np矩陣 print('二維數(shù)組:',matrix) #輸出為單行數(shù)組 print('矩陣形式:\n',matrix_np) #結(jié)果將以多行矩陣的形式輸出 print('矩陣轉(zhuǎn)置:\n',matrix_np.T) print('shape值',matrix_np.shape)
矩陣可以直接進行+、-、*運算,但前提是兩個矩陣的形狀相同。矩陣還可以進行叉乘運算,要求前者的行與后者的列相同,例子如下,運行結(jié)果為右上圖:
ma=np.array([[1,2,3],[4,5,6]]) mb=np.array([[1,2],[3,4],[5,6]]) print(ma+ma) print(ma*ma) #矩陣點乘 print(np.matmul(ma,mb)) #矩陣叉乘
多元線性回歸模型就是在一元線性函數(shù)y=kx+b的基礎(chǔ)上,對于不同的特質(zhì)值x1,x2...xn,將參數(shù)k擴展為多個,即y=k1x1+k2x2+...knxn+b,進而求解n+1個參數(shù)的過程。其中n個k與x相乘可以看作是兩個矩陣相乘。例如下面是一個房價預(yù)測的簡單模型,有x1~x12共12個影響房價的特質(zhì)值,對應(yīng)的標簽為房價,通過多元線性模型求解對應(yīng)的參數(shù)k1~k12、b,從而對房價進行預(yù)測:
%matplotlib notebook import tensorflow as tf import matplotlib.pyplot as plt import numpy as np import pandas as pd from sklearn.utils import shuffle #利用pandas讀取數(shù)據(jù)csv文件 data=pd.read_csv('D:/Temp/data/boston.csv',header=0) #顯示數(shù)據(jù)摘要描述信息 #print(data.describe()) data=np.array(data.values) #將data的值轉(zhuǎn)換為np數(shù)組 for i in range(12): #將所有數(shù)據(jù)進行歸一化處理 data[:,i]=data[:,i]/(data[:,i].max()-data[:,i].min()) x_data=data[:,:12] #截取所有行,0到11列作為特質(zhì)值x y_data=data[:,12] #截取所有行,第12列作為標簽值y x=tf.placeholder(tf.float32,[None,12],name='x') #None代表行數(shù)不確定,12代表一行特征值有12個子數(shù)據(jù) y=tf.placeholder(tf.float32,[None,1],name='y') with tf.name_scope('Model'): #定義命名空間 k=tf.Variable(tf.random_normal([12,1],stddev=0.01),name='k') b=tf.Variable(1.0,name='b') def model(x,k,b): return tf.matmul(k,x)+b #數(shù)組k,x進行叉乘運算再加上b yp=model(x,k,b) #定義超參數(shù):訓(xùn)練次數(shù)、學(xué)習(xí)率、損失函數(shù) train_epochs=50 learning_rate=0.01 with tf.name_scope('Loss'): loss_function=tf.reduce_mean(tf.square(y-yp)) #使用梯度下降法定義優(yōu)化器 optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function) ss=tf.Session() init=tf.global_variables_initializer() ss.run(init) loss_list=[] for _ in range(train_epochs): loss_sum=0 for(xs,ys)in zip(x_data,y_data): xs=xs.reshape(1,12) #調(diào)整數(shù)據(jù)的維數(shù)格式以匹配占位符x ys=ys.reshape(1,1) _,loss=ss.run([optimizer,loss_function],feed_dict={x:xs,y:ys}) loss_sum+=loss shuffle(x_data,y_data) #每輪循環(huán)后,打亂數(shù)據(jù)順序 k_tmp=k.eval(session=ss) b_tmp=b.eval(session=ss) print('k:',k_tmp,',b:',b_tmp) loss_avg=loss_sum/len(y_data) #求每輪的損失值 loss_list.append(loss_avg) plt.plot(loss_list)
注:
pandas是一個python庫,可以提供高性能且易使用的數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)分析工具,可以從csv、excel、txt、sql等文件中讀取數(shù)據(jù),并且將數(shù)據(jù)結(jié)構(gòu)自動轉(zhuǎn)換為Numpy多維數(shù)組。
在使用梯度下降法進行多元線性回歸模型訓(xùn)練時,如果不同的特征值取值范圍相差過大(比如有的特質(zhì)值取值為0.3~0.7,有點特質(zhì)值在300~700),就會影響訓(xùn)練結(jié)果的得出。因此需要對數(shù)據(jù)進行歸一化處理,即用特征值/(大值-最小值),也就是通過放縮將數(shù)據(jù)都統(tǒng)一到0~1之間。
通過tf.name_scope()定義命名空間,定義的變量名只在當(dāng)前空間內(nèi)有效,防止命名沖突。
在初始化變量k時,通過tf.random_normal()從正太分布[1,12]之間隨機選取一個值,其方差stddev=0.01
由于在定義占位符時x為[None,12]類型的二維數(shù)組,所以在填充數(shù)據(jù)時需要通過xs.reshape(1,12)將數(shù)據(jù)xs重新排列為一維含有12個元素,二維含有1個子數(shù)組的二維數(shù)組,同理,y也需要轉(zhuǎn)換。
實現(xiàn)定義loss_list用于保存損失值,在每輪訓(xùn)練后求出損失值的平均值保存到loss_list,最后將其打印成一幅圖,可以看到損失值從一開始急速下降,直到最后變化趨于平緩。
運行結(jié)果如下,截取部分的參數(shù)值以及損失值的曲線:
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python如何通過TensorFLow進行線性模型訓(xùn)練原理”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司,關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、網(wǎng)站設(shè)計器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。