1. 程式人生 > >Tensorflow,線性模型,梯度下降

Tensorflow,線性模型,梯度下降

TF基本

import tensorflow as tf

Tensorflow對於機器學習模型的實現分為兩個階段:
1. 構建階段:搭建計算模型
2. 計算階段:執行計算

舉個簡單示例,我們要計算一個函式f=x2y+y+2,首先需要將這個計算模型搭建起來。

Tensorflow本身提供了視覺化的套件叫做Tensorboard,在模型搭建之前,我們先將Tensorboard設定好。

from datetime import datetime

now=datetime.utcnow().strftime("%Y%m%d%H%M%S")
root_logdir="tf_logs"
#設定根目錄為當前目錄下的tf_logs資料夾 logdir="{}/run-{}/".format(root_logdir,now) #資料夾名加入時間戳

模型的搭建包括:
- 變數的設定與初始值設定
- 變數之間的運算關係

tf.reset_default_graph()        #重置圖

x=tf.Variable(1,name="x")   #初始值為1,名為"x"的變數
y=tf.Variable(2,name="y")   #初始值為2,名為"y"的變數
f=x*x*y+y+2     #變數間的運算關係

file_writer=tf.summary
.FileWriter(logdir,tf.get_default_graph()) #將預設圖寫入檔案

然後啟動一個會話,在會話中進行計算:

with tf.Session() as sess:
    x.initializer.run()
    y.initializer.run()
    result=f.eval()

file_writer.close()     #關閉寫入器
print(result)

輸出6。

需要注意的是上述程式碼中,x,y均是作為tf變數存在,tf變數有如下特點:
- 需要設定初始值
- 在計算之前需要在會話中進行初始化
- 變數的生命週期開始於初始化,與會話一同結束

因為我們在上述程式碼中儲存了圖,所以可以在Tensorboard中觀察。在控制檯中鍵入tensorboard --logdir C:\Users\qq435\Desktop\tf_logs啟動Tensorboard服務,在瀏覽器中鍵入http://daya-workstation:6006/進入Tensorboard的頁面。

上述模型(方程式)的計算圖如下圖所示:

Tensorflow對於模型的實現既然分為構建階段和計算階段,那麼理所當然地,構建階段是不進行計算的,計算任務均在計算階段進行。

線性模型

這節我們使用TF搭建線性模型對加州房價資料進行處理。

前置模組與設定

import tensorflow
import numpy as np
from datetime import datetime

root_logdir="tf_logs"       #設定根目錄為當前目錄下的tf_logs資料夾

獲取資料

from sklearn.datasets import fetch_california_housing

housing=fetch_california_housing()      #每一個樣本為行向量
m,n=housing.data.shape    #m為樣本數

計算模型搭建

正規方程

利用正規方程W=(XTX)1XTY優化線性模型。

housing_data_plus_bias=np.c_[np.ones((m,1)),housing.data]    #在資料第一列前加上偏置項1

tf.reset_default_graph()

X=tf.constant(housing_data_plus_bias,dtype=tf.float32,name="X")    #常量值不需要初始化
Y=tf.constant(housing.target.reshape(-1,1),dtype=tf.float32,name="Y")
XT=tf.transpose(X)

W=tf.matmul(tf.matmul(tf.matrix_inverse(tf.matmul(XT,X)),XT),Y)    #正規方程

now=datetime.utcnow().strftime("%Y%m%d%H%M%S")
logdir="{}/run-{}/".format(root_logdir,now)     #資料夾名加入時間戳
file_writer=tf.summary.FileWriter(logdir,tf.get_default_graph())

with tf.Session() as sess:
    W_val=W.eval()

file_writer.close()
print(W_val)

以上程式碼所生成的計算圖如下圖所示:

梯度下降法

以MSE作為損失函式,使用梯度下降法來優化線性模型。

在使用梯度下降法時,預先對資料進行縮放處理能夠加快收斂,使用sklearn中的預處理包來進行縮放。

from sklearn.preprocessing import StandardScaler

#資料縮放
scaler = StandardScaler()
scaled_housing_data = scaler.fit_transform(housing.data)
scaled_housing_data_plus_bias = np.c_[np.ones((m, 1)), scaled_housing_data]

在搭建模型之前,先介紹一種Tensorflow中的新型別:placeholder。placeholder在Tensorboard中表現為一個佔位節點,其在計算階段需要輸入資料才能進行計算,否則報錯。

使用tf搭建模型的慣用方法是將輸入資料X與資料標籤Y通過placeholder來實現,然後在計算階段對X、Y輸入相應的資料與標籤即可。具體做法見程式碼。

在使用梯度下降法時,我們可以繪製出loss-epoch學習曲線,Tensorboard中提供了非常便捷的曲線視覺化功能。下述兩段程式碼都將MSE與epoch寫入到了Tensorboard檔案中以供視覺化。

batch梯度下降

#構建計算圖
tf.reset_default_graph()
n_epochs=1000
learning_rate=0.01

X=tf.placeholder(dtype=tf.float32,name="X")
Y=tf.placeholder(dtype=tf.float32,name="Y")
W=tf.Variable(tf.random_uniform([n+1,1],-1,1),name="W")        #因為X第一列加了偏置項,所以W的形狀對應的需要加1

Y_pre=tf.matmul(X,W,name="prediction")

#整合節點
with tf.name_scope("loss") as scope:
    error=Y_pre-Y
    mse=tf.reduce_mean(tf.square(error),name="mse")

optimizer=tf.train.GradientDescentOptimizer(learning_rate=learning_rate)    #設定優化器
training_op=optimizer.minimize(mse)    #優化目標

#tensorboard設定
mse_summary=tf.summary.scalar('MSE',mse)
now=datetime.utcnow().strftime("%Y%m%d%H%M%S")
logdir="{}/run-{}/".format(root_logdir,now)     #資料夾名加入時間戳
file_writer=tf.summary.FileWriter(logdir,tf.get_default_graph())

with tf.Session() as sess:
    W.initializer.run()

    for epoch in range(n_epochs):
        if epoch%10==0:
            #計算過程需要對placeholder給資料
            summary_str=mse_summary.eval(feed_dict={X:scaled_housing_data_plus_bias,Y:housing.target.reshape(-1,1)})
            file_writer.add_summary(summary_str,epoch)
        sess.run(training_op,feed_dict={X:scaled_housing_data_plus_bias,Y:housing.target.reshape(-1,1)})    #給資料

    W_val=W.eval()
    print(W_val)

file_writer.close()

計算圖如下圖所示:

學習曲線如圖所示:

mini-batch梯度下降

#構建計算圖
tf.reset_default_graph()
n_epochs=10
learning_rate=0.01

X=tf.placeholder(dtype=tf.float32,name="X")
Y=tf.placeholder(dtype=tf.float32,name="Y")
W=tf.Variable(tf.random_uniform([n+1,1],-1,1),name="W")

batch_size=100
n_batches=int(np.ceil(m/batch_size))

#隨機取batch
def fetch_batch(epoch,batch_index,batch_size):
    np.random.seed(epoch * n_batches + batch_index)
    indices = np.random.randint(m, size=batch_size)
    X_batch = scaled_housing_data_plus_bias[indices]
    Y_batch = housing.target.reshape(-1, 1)[indices]
    return X_batch,Y_batch

Y_pre=tf.matmul(X,W,name="prediction")

#整合節點
with tf.name_scope("loss") as scope:
    error=Y_pre-Y
    mse=tf.reduce_mean(tf.square(error),name="mse")

optimizer=tf.train.GradientDescentOptimizer(learning_rate=learning_rate)    #設定優化器
training_op=optimizer.minimize(mse)    #優化目標

#tensorboard設定
mse_summary=tf.summary.scalar('MSE',mse)
now=datetime.utcnow().strftime("%Y%m%d%H%M%S")
logdir="{}/run-{}/".format(root_logdir,now)     #資料夾名加入時間戳
file_writer=tf.summary.FileWriter(logdir,tf.get_default_graph())

with tf.Session() as sess:
    W.initializer.run()

    for epoch in range(n_epochs):
        for batch_index in range(n_batches):
            X_batch,Y_batch=fetch_batch(epoch,batch_index,batch_size)
            if batch_index%10==0:
                summary_str=mse_summary.eval(feed_dict={X:X_batch,Y:Y_batch})    #給資料
                file_writer.add_summary(summary_str,epoch*batch_size+batch_index)
            sess.run(training_op,feed_dict={X:X_batch,Y:Y_batch})    #給資料

    W_val=W.eval()
    print(W_val)

file_writer.close()

mini-batch梯度下降的計算圖與batch梯度下降是一樣的,因為沒有改變計算過程,只是將資料分批多次輸入。

學習曲線如下圖所示:

相關推薦

Tensorflow,線性模型,梯度下降

TF基本 import tensorflow as tf Tensorflow對於機器學習模型的實現分為兩個階段: 1. 構建階段:搭建計算模型 2. 計算階段:執行計算 舉個簡單示例,我們要計算一個函式f=x2y+y+2f=x2y+y+2,首先需

2.線性模型——梯度下降

梯度: 對於一個標量,也就是一維,梯度就是 + 或者 - 。平面二維向量,梯度也是一個向量,這個向量的方向就是梯度的方向。同理 NNN維,所有梯度也可以沿著變數分解成為相應的梯度分量。 損失函式:L(f)=∑i=1N(yi^−yi)2=∑i=1N(w⃗⋅x⃗+

[教程10]TensorFlow線性模型教程

了解 air into tip 必須 輸出 ros 自己的 rmi [教程10]TensorFlow線性模型教程 在本教程中,我們將使用TensorFlow中的tf.estimator API來解決二進制分類問題:根據年齡,性別,教育和職業(特征)等個人的普查數據,我們將嘗

線性迴歸 梯度下降演算法 overshot the minimun現象

在梯度下降演算法中,理論上有一個步長steep需要我們設定。steep的設定非常重要,如果設定不當,我們的梯度下降演算法可能就得不到我們想要的結果。 一:步長不當導致的問題 如果步長太短,很顯然我們訓練集訓練的時間就會加長。如果訓練集比較多,這也是致命的。 如果步長太長,可能出現Oversho

線性迴歸梯度下降 Octave

首先對一堆樣本點我們假設目標函式為: 在Gradient Descent Algorithm中,我們利用不斷推導得到兩個對此演算法非常重要的公式,一個是J(θ)是代價函式: 使用偏導數的方式使得theta的值逐步取得滿足當前代價函式的最小值,

線性迴歸梯度下降

import numpy as npimport matplotlib.pyplot as pltnp.random.seed(666)x = 2 * np.random.random(size=100)y = x*3. + 4. + np.random.normal(size=100)X = x.resha

機器學習--線性迴歸--梯度下降的實現

## 機器學習--線性單元迴歸--單變數梯度下降的實現 ### 【線性迴歸】 ```text 如果要用一句話來解釋線性迴歸是什麼的話,那麼我的理解是這樣子的: **線性迴歸,是從大量的資料中找出最優的線性(y=ax+b)擬合函式,通過資料確定函式中的未知引數,進而進行後續操作(預測) **迴歸的概念是從統

tensorflow實現svm多分類 iris 3分類——本質上在使用梯度下降法求解線性回歸(loss是定制的而已)

points near plot asi atm lob put matplot ive # Multi-class (Nonlinear) SVM Example # # This function wll illustrate how to # implement

【機器學習】基於梯度下降法的自線性迴歸模型

回顧 關於梯度下降法 以及線性迴歸的介紹,我們知道了: 線性迴歸的損失函式為: J (

線性迴歸模型採用梯度下降演算法求最優解

本人學習人工智慧之深度學習已有一段時間,第一個機器學習演算法就是梯度下降演算法,本部落格將詳細闡述線性迴歸模型採用梯度下降演算法求得最優解。 本文將從運用以下流程圖講解SGD: 1、線性迴歸模型 2、代價函式 3、使用梯度下降最小化代價函式 第一部分:

線性迴歸、梯度下降演算法與 tensorflow

舉個栗子 考慮一個二手房交易記錄資料集. 已知房屋面積,臥室數量和交易價格: 根據這個資料集,要求我們估算當前某個給定房屋價格. 我們應該怎麼做? 線性迴歸 迴歸就是根據已知資料來預測另一個數值型資料的目標值. 假設特徵和結果滿足線性關係: h(x

TensorFlow 梯度下降線性迴歸並可視化

import tensorflow as tf import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D lr = 0.1 real_params = [1.2, 2.5] # 真

Tensorflow環境下 線性迴歸(梯度下降)的練手例項(完整原始碼+說明)

Tensorflow 入門篇-最小二乘法的線性迴歸演算法    本文將藉助Tensorflow來實現最小二乘法的線性迴歸演算法。    大體的思路:首先生成隨機紊亂的資料集,然後構建線性迴歸的Graph,最後在Session中迭代train器,得到擬合的引數w和b,最後畫出擬

使用梯度下降演算法來求解線性迴歸模型

廢話 求解線性迴歸模型的解析解可以直接使用公式,這節可以使用梯度下降演算法來求解這類問題的優化問題: 原理的東西不想說了 ,總之機器學習的一般思路都是: 構建模型(也就是你想建立什麼樣的預測函式

對數幾率回歸法(梯度下降法,隨機梯度下降與牛頓法)與線性判別法(LDA)

3.1 初始 屬性 author alt closed sta lose cnblogs   本文主要使用了對數幾率回歸法與線性判別法(LDA)對數據集(西瓜3.0)進行分類。其中在對數幾率回歸法中,求解最優權重W時,分別使用梯度下降法,隨機梯度下降與牛頓法。 代碼如下:

機器學習入門:線性回歸及梯度下降

想要 oom 考試 erl text local oca 希望 觀察 機器學習入門:線性回歸及梯度下降 本文會講到: (1)線性回歸的定義 (2)單變量線性回歸 (3)cost function:評價線性回歸是否擬合訓練集的方法 (4)梯度下

線性回歸的梯度下降

初始 應用 連接 alt wid png 分享 sub 線性回歸 Note: [At 6:15 "h(x) = -900 - 0.1x" should be "h(x) = 900 - 0.1x"] 當具體應用於線性回歸的情況下,可以推導出一種新的梯度下降方程。我們可以

Tensorflow 梯度下降實例

ons 梯度 div ati x11 code sce oba ble # coding: utf-8 # #### 假設我們要最小化函數 $y=x^2$, 選擇初始點 $x_0=5$ # #### 1. 學習率為1的時候,x在5和-5之間震蕩。 # In[1

ng機器學習視頻筆記(一)——線性回歸、代價函數、梯度下降基礎

info 而且 wid esc 二維 radi pan 圖形 clas ng機器學習視頻筆記(一) ——線性回歸、代價函數、梯度下降基礎 (轉載請附上本文鏈接——linhxx) 一、線性回歸 線性回歸是監督學習中的重要算法,其主要目的在於用一個函數表

【吳恩達機器學習】學習筆記——2.7第一個學習算法=線性回歸+梯度下降

com 梯度 .com 局部最優 alt ima 實現 梯度下降 width 梯度下降算法:              線性回歸模型:       線性假設:                      平方差成本函數: 將各個公式代入,對θ0、θ1分別求偏導得: 再將偏