網路城邦
上一篇 回創作列表 下一篇   字體:
Python機器學習筆記(十三):TensorFlow概念整理
2020/09/27 00:16:54瀏覽863|回應0|推薦3
Python機器學習筆記(十三):TensorFlow概念整理

一、什麼是TensorFlow

(一)TensorFlow簡介

TensorFlow是由Google Brain團隊開發出來的一個可擴展的多平台程式設計介面,用於實作和執行機器學習演算法,於2015年11月以寬鬆的開源版權公開給大眾使用。TensorFlow目前支持多種程式語言的前端介面,而Python的API算是較完整的。

我們可將TensorFlow拆成Tensor與Flow二個部份,來更深入了解TensorFlow,餵給模型處理或由模型計算、輸出的數據可視為Tensor,而模型的演算流程即是Flow。

(二)Tenor(「張量」)概述

「張量」是紀錄數據值的一個物件,而「張量」的維數則稱為「階」(rank),例如:

  • 一個整數或浮點數的「純量」,就稱為一個「階度」為0的「張量」

  • 向量則是「階度」為1的「張量」

  • 矩陣是「階度」為2的「張量」

依其性質,「張量」可區分為以下二種類型:

1.佔位符(placeholders)

「佔位符」是個事先定義好,具有特定型別和形狀的「張量」,是作為為模型輸入數據的機制。

2.變數(variable)

「變數」是個特殊型別的「張量」物件,我們利用它來儲存和更新模型演算過程中的運算參數。

(三)Flow概念

在這裏我們要認識「計算圖」(Graph)與「工作」(Session)這二個觀念,我們可簡略地將「計算圖」視為在規劃草圖,而「工作」則是真正在草圖上畫上顏色,所以同樣的草圖,我們可執行不同的「工作」為其畫上不同的顏色,而每次「工作」完成的圖可儲存起來,供未來使用。

步驟流程可略述如下:

1.建立一個新的、空的「計算圖」。

2.將節點(「張量」與模型運算式)加入這個「計算圖」。

3.執行這個「計算圖」:

(1)開始一個新的「工作」

(2)初始化「計算圖」中的「變數」

(3)執行這個「工作」中的「計算圖」

(4)將「工作」執行完成的「計算圖」儲存起來(儲存模型變數)

4.呼叫先前執行完成的「計算圖」

(1)重建一個與儲存模型具有相同節點和名稱的「計算圖」

(2)在新的「工作」環境中將儲存的變數載入


二、以一元一次迴歸模型練習說明TensorFlow流程


"""

迴歸模型

y = wx + b

x:特徵向量

y:目標向量

w:加權參數

b:偏誤參數

"""


"""

資料集

訓練資料:

x_train:訓練用特徵向量

y_train:訓練用目標向量

測試資料:

x_test:測試用特徵向量

y_test:測試用目標向量

"""


# 安裝TensorFlow套件至Python平台

pip install tensorflow


# 在Python程式中匯入tensorflow

import tensorflow as tf


# 產生一張TensorFlow的空白計算圖

g = tf.Graph()


# 將「張量」與模型運算式加到計算圖裏

with g.as_default():

  # 設定隨機抽樣種子

  tf.set_random_seed(123)

 

 # 1.加入「張量」

  # 1.1.加入模型佔位符

  # 1.1.1.加入特徵向量佔位符

  tf_x = tf.placeholder(shape=(None), dtype=tf.float32, name='tf_x')  #  shape設定為None的原因,是因為無法事先就知道會輸入多少筆資料


  # 1.1.2.加入目標向量佔位符

  tf_y = tf.placeholder(shape=(None), dtype=tf.float32, name='tf_y')

 

 # 1.2.加入模型變數

  # 1.2.1.加入加權參數變數

  weight = tf.Variable(tf.random_normal(shape=(1,1),stddev=0.25)), name='weight)  # 隨機設定加權參數初始值


  # 1.2.2.加入偏誤參數變數

  bias = tf.Variable(0.0, name='bias')  # 設定偏誤參數初始值為0.0


  # 2.加入模型運算式

  # 2.1.建立y=wx+b迴歸模型

  y_hat = tf.add(weight * tf_x, bias, name='y_hat')


  # 2.2.以「均方誤差(MSE)」作為模型訓練時的成本函數

  cost = tf.reduce_mean(tf.square(tf_y - y_hat), name='cost')


  # 2.3.以梯度下降法最小化成本函數來訓練模型

  optim = tf.train.GradientDescentOptimizer(learning_rate=0.001)  # 設定梯度下降法

train_op = optim.minimize(cost, name='train_op')  # 以最小化成本函數來訓練模型


  # 3.我們產生一個tf.train.Saver類別物件,將模型訓練結果儲存起來

  saver = tf.train.Saver()


# 開始一個新的「工作」,執行先前已定義好的「計算圖」g

with tf.Session(graph=g) as sess:

  # 1.初始化「計算圖」g中定義的「變數」w、b的初始值

  sess.run(tf.global_variables_initializer())


  # 2.開始執行這個「工作」中的「計算圖」來訓練模型

  ## 設定訓練模型500次

  for i in range(500):

    ## 指定數據集x_train為「計算圖」中佔位符tf_x

    ## 指定數據集y_train為「計算圖」中佔位符tf_y

    ## 使用tf_x及tf_y這二個「佔位符」「張量」,執行「計算圖」裏定義的最小成本梯度下降法運算式來訓練模型

    c, _ = sess.run([cost, train_op], feed_dict={tf_x: x_train, tf_y: y_train})


  # 3.完成500次的訓練後,將模型的訓練結果儲存起來

  saver.save(sess, './trained-model')  # './trained-model'為指定檔案儲存名稱


"""

模型經過500次訓練後,會產生一組經訓練結果產生的w與b值

"""


"""

利用前面訓練好的模型,餵給模型測試資料x_test,求算迴歸模型的預測目標向量

"""

# 產生一張新的「計算圖」

g2 = tf.Graph()

#  開始一個新的「工作」,執行g2「計算圖」

with tf.Session(graph=g2) as sess:

  # 1.重建一個與先前儲存模型有相同節點和名稱的「計算圖」

  new_saver = tf.train.import_meta_graph('./trained-model.meta')


  # 2.在新的工作環境中,將儲存的w、b變數載入

   new_saver.restore(sess, './trained-model')


  # 3.餵給模型測試資料x_test,執行「計算圖」定義的迴歸運算式,求算模型的預測目標向量

  y_pred = sess.run('y_hat: 0, feed_dict={'tf_x:0': x_test})

( 知識學習其他 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=gwogo&aid=150971954