亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python通過(guò)TensorFLow進(jìn)行線性模型訓(xùn)練原理與實(shí)現(xiàn)方法詳解

 更新時(shí)間:2020年01月15日 11:21:21   作者:theVicTory  
這篇文章主要介紹了Python通過(guò)TensorFLow進(jìn)行線性模型訓(xùn)練原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Python通過(guò)TensorFLow進(jìn)行線性模型訓(xùn)練相關(guān)概念、算法設(shè)計(jì)與訓(xùn)練操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Python通過(guò)TensorFLow進(jìn)行線性模型訓(xùn)練原理與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:

1、相關(guān)概念

例如要從一個(gè)線性分布的途中抽象出其y=kx+b的分布規(guī)律

特征是輸入變量,即簡(jiǎn)單線性回歸中的 x 變量。簡(jiǎn)單的機(jī)器學(xué)習(xí)項(xiàng)目可能會(huì)使用單個(gè)特征,而比較復(fù)雜的機(jī)器學(xué)習(xí)項(xiàng)目可能會(huì)使用數(shù)百萬(wàn)個(gè)特征。

標(biāo)簽是我們要預(yù)測(cè)的事物,即簡(jiǎn)單線性回歸中的 y 變量。

樣本是指具體的數(shù)據(jù)實(shí)例。有標(biāo)簽樣本是指具有{特征,標(biāo)簽}的數(shù)據(jù),用于訓(xùn)練模型,總結(jié)規(guī)律。無(wú)標(biāo)簽樣本只具有特征的數(shù)據(jù)x,通過(guò)模型預(yù)測(cè)其y值。

模型是由特征向標(biāo)簽映射的工具,通過(guò)機(jī)器學(xué)習(xí)建立。

訓(xùn)練是指模型通過(guò)有標(biāo)簽樣本來(lái)學(xué)習(xí),確定其參數(shù)的理想值。通俗理解就是在給出一些樣本點(diǎn)(x,y),總結(jié)其規(guī)律確定模型y=kx+b中的兩個(gè)參數(shù)k、b,進(jìn)而利用這個(gè)方程,在只給出x的情況下計(jì)算出對(duì)應(yīng)的y值。

損失是一個(gè)數(shù)值,用于表示對(duì)于單個(gè)樣本而言模型預(yù)測(cè)的準(zhǔn)確程度。預(yù)測(cè)值與準(zhǔn)確值相差越大,損失越大。檢查樣本并最大限度地減少模型損失的過(guò)程叫做經(jīng)驗(yàn)風(fēng)險(xiǎn)最小化。L1損失是標(biāo)簽預(yù)測(cè)值與實(shí)際值差的絕對(duì)值。平方損失是樣本預(yù)測(cè)值與實(shí)際值的方差。

模型的訓(xùn)練是一個(gè)迭代的過(guò)程,首先對(duì)模型的參數(shù)進(jìn)行初始參數(shù),得到一個(gè)初步模型并計(jì)算出特征對(duì)應(yīng)的標(biāo)簽值,然后經(jīng)過(guò)比對(duì)計(jì)算出損失。之后對(duì)模型的參數(shù)進(jìn)行調(diào)整,之后再進(jìn)行預(yù)測(cè)、計(jì)算損失,如此循環(huán)直到總損失不再變化或變化很緩慢為止,這時(shí)稱該模型已經(jīng)收斂。

類似于對(duì)于一個(gè)二次函數(shù),通過(guò)不斷調(diào)整x的值,找到其函數(shù)的極值點(diǎn),在該點(diǎn)處函數(shù)的變化率為0。那么如何找到極值點(diǎn),可以采用梯度下降法,即對(duì)于函數(shù)曲線,朝著其梯度值減少的方向(負(fù)梯度)探索便可以最快找到極值點(diǎn)。

前向傳播:根據(jù)輸入計(jì)算輸出值。反向傳播:根據(jù)優(yōu)化器算法計(jì)算內(nèi)部變量的調(diào)整幅度,從輸出層級(jí)開始,并往回計(jì)算每個(gè)層級(jí),直到抵達(dá)輸入層。

在梯度下降法中,批量是指單次迭代中用于計(jì)算梯度的樣本數(shù)。隨機(jī)梯度下降法是指每次隨機(jī)選擇一個(gè)樣本進(jìn)行梯度計(jì)算。

  

那么朝探索的方向前進(jìn)多少比較合適?這就涉及到學(xué)習(xí)速率,用梯度乘以學(xué)習(xí)速率就得到了下一個(gè)點(diǎn)的位置,也叫做步長(zhǎng),如果步長(zhǎng)過(guò)小,那么可能需要許多次才可到達(dá)目標(biāo)點(diǎn),如果步長(zhǎng)過(guò)大,則可能越過(guò)目標(biāo)點(diǎn)。

這種參數(shù)需要人為在學(xué)習(xí)之前設(shè)置參數(shù),而不是通過(guò)訓(xùn)練得到的參數(shù),這種參數(shù)叫做超參數(shù)。超參數(shù)是編程人員用于對(duì)機(jī)器學(xué)習(xí)進(jìn)行調(diào)整的旋鈕。

2、算法設(shè)計(jì)與訓(xùn)練

通過(guò)Tensor FLow進(jìn)行訓(xùn)練的步驟主要有:準(zhǔn)備數(shù)據(jù)、構(gòu)建模型、訓(xùn)練模型、進(jìn)行預(yù)測(cè)

準(zhǔn)備數(shù)據(jù)

使用的數(shù)據(jù)可以是從生活中的數(shù)據(jù)經(jīng)過(guò)加工而來(lái),也可以是人工生成的數(shù)據(jù)集,例如產(chǎn)生y=2x+1附近的隨機(jī)數(shù)點(diǎn):

#在jupyter中設(shè)置圖像的顯示方式inline,否則圖像不顯示
%matplotlib inline         
import tensorflow as tf
import numpy as np             #Python的一種開源的數(shù)值計(jì)算擴(kuò)展
import matplotlib.pyplot as plt      #Python的一種繪圖庫(kù)
 
np.random.seed(5)             #設(shè)置產(chǎn)生偽隨機(jī)數(shù)的類型
x=np.linspace(-1,1,100)          #在-1到1之間產(chǎn)生100個(gè)等差數(shù)列作為圖像的橫坐標(biāo)
#根據(jù)y=2*x+1+噪聲產(chǎn)生縱坐標(biāo)
#randn(100)表示從100個(gè)樣本的標(biāo)準(zhǔn)正態(tài)分布中返回一個(gè)樣本值,0.4為數(shù)據(jù)抖動(dòng)幅度
y=2*x+1.0+np.random.randn(100)*0.4
 
plt.scatter(x,y)              #生成散點(diǎn)圖
plt.plot(x,2*x+1,color='red',linewidth=3)  #生成直線y=2x+1

在jupyter中繪制出了人工數(shù)據(jù)的散點(diǎn)圖與曲線如下:

構(gòu)建模型

#定義函數(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為標(biāo)簽
x=tf.placeholder(name='x')
y=tf.placeholder(name='y')
#通過(guò)模型得出特征值x對(duì)應(yīng)的預(yù)測(cè)值yp
yp=model(x,k,b)

k、b的初始值并不會(huì)影響最終結(jié)果的得到,所以可以隨意指定一個(gè)值。

訓(xùn)練模型

#訓(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)
 
#進(jìn)行多輪迭代訓(xùn)練,每輪將樣本值逐個(gè)輸入模型,進(jì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)驗(yàn)一般設(shè)置在0.01到0.1之間

采用均方差為損失函數(shù),square求出y-yp的平方,再通過(guò)reduce_mean()求出平均值

再將之前人工生成的數(shù)據(jù)輸入到占位符時(shí),通過(guò)zip()函數(shù)先將每個(gè)sx,sy對(duì)應(yīng)壓縮為一個(gè)二維數(shù)組,然后對(duì)100個(gè)二維數(shù)組進(jìn)行遍歷取出并分別填充到占位符x、y,使會(huì)話運(yùn)行優(yōu)化器optimizer進(jìn)行迭代訓(xùn)練。

可以看到運(yùn)行結(jié)果如下,預(yù)測(cè)的曲線慢慢向分布的散點(diǎn)進(jìn)行擬合

進(jìn)行預(yù)測(cè)

根據(jù)函數(shù)模型,y=kx+b,將得到的參數(shù)k、b和特質(zhì)值x帶入即可得到標(biāo)簽y的預(yù)測(cè)值

3、數(shù)組操作

Numpy是一個(gè)支持大量的維度數(shù)組與矩陣運(yùn)算的python庫(kù),通過(guò)它可以很便捷地將數(shù)據(jù)轉(zhuǎn)換為數(shù)組并進(jìn)行操作。np類型的shape屬性可以輸出數(shù)組的維數(shù)構(gòu)成。可以通過(guò)np.T對(duì)數(shù)組進(jìn)行轉(zhuǎn)置,或者np.rashape(3,2)將數(shù)組轉(zhuǎn)換為目標(biāo)形狀。例子如下

scalar=1
scalar_np=np.array(scalar)       #將標(biāo)量轉(zhuǎn)化為np的數(shù)組類型
print(scalar_np.shape)         #只有np才有shape屬性,標(biāo)量對(duì)應(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)

     

矩陣可以直接進(jìn)行+、-、*運(yùn)算,但前提是兩個(gè)矩陣的形狀相同。矩陣還可以進(jìn)行叉乘運(yùn)算,要求前者的行與后者的列相同,例子如下,運(yùn)行結(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)             #矩陣點(diǎn)乘
print(np.matmul(ma,mb))       #矩陣叉乘

4、多元線性回歸模型

多元線性回歸模型就是在一元線性函數(shù)y=kx+b的基礎(chǔ)上,對(duì)于不同的特質(zhì)值x1,x2...xn,將參數(shù)k擴(kuò)展為多個(gè),即y=k1x1+k2x2+...knxn+b,進(jìn)而求解n+1個(gè)參數(shù)的過(guò)程。其中n個(gè)k與x相乘可以看作是兩個(gè)矩陣相乘。例如下面是一個(gè)房?jī)r(jià)預(yù)測(cè)的簡(jiǎn)單模型,有x1~x12共12個(gè)影響房?jī)r(jià)的特質(zhì)值,對(duì)應(yīng)的標(biāo)簽為房?jī)r(jià),通過(guò)多元線性模型求解對(duì)應(yīng)的參數(shù)k1~k12、b,從而對(duì)房?jī)r(jià)進(jìn)行預(yù)測(cè):

%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ù)進(jìn)行歸一化處理
  data[:,i]=data[:,i]/(data[:,i].max()-data[:,i].min())
x_data=data[:,:12]                  #截取所有行,0到11列作為特質(zhì)值x
y_data=data[:,12]                   #截取所有行,第12列作為標(biāo)簽值y
 
x=tf.placeholder(tf.float32,[None,12],name='x')  
#None代表行數(shù)不確定,12代表一行特征值有12個(gè)子數(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進(jìn)行叉乘運(yùn)算再加上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是一個(gè)python庫(kù),可以提供高性能且易使用的數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)分析工具,可以從csv、excel、txt、sql等文件中讀取數(shù)據(jù),并且將數(shù)據(jù)結(jié)構(gòu)自動(dòng)轉(zhuǎn)換為Numpy多維數(shù)組。

在使用梯度下降法進(jìn)行多元線性回歸模型訓(xùn)練時(shí),如果不同的特征值取值范圍相差過(guò)大(比如有的特質(zhì)值取值為0.3~0.7,有點(diǎn)特質(zhì)值在300~700),就會(huì)影響訓(xùn)練結(jié)果的得出。因此需要對(duì)數(shù)據(jù)進(jìn)行歸一化處理,即用特征值/(最大值-最小值),也就是通過(guò)放縮將數(shù)據(jù)都統(tǒng)一到0~1之間。

通過(guò)tf.name_scope()定義命名空間,定義的變量名只在當(dāng)前空間內(nèi)有效,防止命名沖突。

在初始化變量k時(shí),通過(guò)tf.random_normal()從正太分布[1,12]之間隨機(jī)選取一個(gè)值,其方差stddev=0.01

由于在定義占位符時(shí)x為[None,12]類型的二維數(shù)組,所以在填充數(shù)據(jù)時(shí)需要通過(guò)xs.reshape(1,12)將數(shù)據(jù)xs重新排列為一維含有12個(gè)元素,二維含有1個(gè)子數(shù)組的二維數(shù)組,同理,y也需要轉(zhuǎn)換。

實(shí)現(xiàn)定義loss_list用于保存損失值,在每輪訓(xùn)練后求出損失值的平均值保存到loss_list,最后將其打印成一幅圖,可以看到損失值從一開始急速下降,直到最后變化趨于平緩。

運(yùn)行結(jié)果如下,截取部分的參數(shù)值以及損失值的曲線:

                              

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 女神相冊(cè)密碼忘記了 我只用Python寫了20行代碼

    女神相冊(cè)密碼忘記了 我只用Python寫了20行代碼

    這篇文章主要介紹了怎么樣用Python寫了20行代碼來(lái)破解找回已經(jīng)忘記的密碼,密碼的排列組合是有限的,遍歷嘗試就能夠試出正確的密碼,但這個(gè)工作要怎么用python實(shí)現(xiàn),請(qǐng)看下文
    2021-08-08
  • python實(shí)現(xiàn)rest請(qǐng)求api示例

    python實(shí)現(xiàn)rest請(qǐng)求api示例

    這篇文章主要介紹了python實(shí)現(xiàn)rest請(qǐng)求api示例,需要的朋友可以參考下
    2014-04-04
  • Python利用Selenium實(shí)現(xiàn)彈出框的處理

    Python利用Selenium實(shí)現(xiàn)彈出框的處理

    經(jīng)常出現(xiàn)在網(wǎng)頁(yè)上的基于JavaScript實(shí)現(xiàn)的彈出框有三種,分別是?alert、confirm、prompt?。本文主要是學(xué)習(xí)如何利用selenium處理這三種彈出框,感興趣的可以了解一下
    2022-06-06
  • python如何求數(shù)組連續(xù)最大和的示例代碼

    python如何求數(shù)組連續(xù)最大和的示例代碼

    這篇文章主要介紹了python如何求數(shù)組連續(xù)最大和的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python中字典及遍歷常用函數(shù)的使用詳解

    Python中字典及遍歷常用函數(shù)的使用詳解

    這篇文章主要為大家介紹了Python中字典有關(guān)的常見函數(shù)的使用方法,以及字典遍歷的方法。文中通過(guò)示例代碼為我們進(jìn)行了詳細(xì)介紹,對(duì)學(xué)習(xí)Python字典有一定幫助,需要的可以參考一下
    2022-06-06
  • 詳解Python的函數(shù)與異常

    詳解Python的函數(shù)與異常

    這篇文章主要為大家介紹了Python的函數(shù)與異常,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • Python數(shù)據(jù)分析的八種處理缺失值方法詳解

    Python數(shù)據(jù)分析的八種處理缺失值方法詳解

    缺失值可能是數(shù)據(jù)科學(xué)中最不受歡迎的值,然而,它們總是在身邊。忽略缺失值也是不合理的,因此我們需要找到有效且適當(dāng)?shù)靥幚硭鼈兊姆椒?/div> 2021-11-11
  • python處理圖片之PIL模塊簡(jiǎn)單使用方法

    python處理圖片之PIL模塊簡(jiǎn)單使用方法

    這篇文章主要介紹了python處理圖片之PIL模塊簡(jiǎn)單使用方法,涉及Python使用PIL模塊實(shí)現(xiàn)針對(duì)圖片的銳化、繪制直線、繪制橢圓等相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • python 對(duì)類的成員函數(shù)開啟線程的方法

    python 對(duì)類的成員函數(shù)開啟線程的方法

    今天小編就為大家分享一篇python 對(duì)類的成員函數(shù)開啟線程的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python下opencv圖像閾值處理的使用筆記

    Python下opencv圖像閾值處理的使用筆記

    這篇文章主要介紹了Python下opencv圖像閾值處理的使用筆記,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論