1. 程式人生 > >機器學習TensorFlow 程式設計概念

機器學習TensorFlow 程式設計概念

一 學習目標:

學習 TensorFlow 程式設計模型的基礎知識,重點了解以下概念:

  • 張量
  • 指令
  • 會話

構建一個簡單的 TensorFlow 程式,使用該程式繪製一個預設圖並建立一個執行該圖的會話

二 概念概覽

TensorFlow 的名稱源自張量,張量是任意維度的陣列。藉助 TensorFlow,您可以操控具有大量維度的張量。即便如此,在大多數情況下,您會使用以下一個或多個低維張量:

  • 標量是零維陣列(零階張量)。例如,\'Howdy\'5
  • 向量是一維陣列(一階張量)。例如,[2, 3, 5, 7, 11]
    [5]
  • 矩陣是二維陣列(二階張量)。例如,[[3.1, 8.2, 5.9][4.3, -2.7, 6.5]]

TensorFlow 指令會建立、銷燬和操控張量。典型 TensorFlow 程式中的大多數程式碼行都是指令。

TensorFlow (也稱為計算圖資料流圖)是一種圖資料結構。很多 TensorFlow 程式由單個圖構成,但是 TensorFlow 程式可以選擇建立多個圖。圖的節點是指令;圖的邊是張量。張量流經圖,在每個節點由一個指令操控。一個指令的輸出張量通常會變成後續指令的輸入張量。TensorFlow 會實現延遲執行模型,意味著系統僅會根據相關節點的需求在需要時計算節點。

張量可以作為常量變數儲存在圖中。您可能已經猜到,常量儲存的是值不會發生更改的張量,而變數儲存的是值會發生更改的張量。不過,您可能沒有猜到的是,常量和變數都只是圖中的一種指令。常量是始終會返回同一張量值的指令。變數是會返回分配給它的任何張量的指令。

要定義常量,請使用 tf.constant 指令,並傳入它的值。例如:

  x = tf.constant([5.2])

同樣,您可以建立如下變數:

  y = tf.Variable([5])

或者,您也可以先建立變數,然後再如下所示地分配一個值(注意:您始終需要指定一個預設值):

  y = tf.Variable([0])
  y = y.assign([5])

定義一些常量或變數後,您可以將它們與其他指令(如 tf.add)結合使用。在評估 tf.add 指令時,它會呼叫您的 tf.constanttf.Variable 指令,以獲取它們的值,然後返回一個包含這些值之和的新張量。

圖必須在 TensorFlow 會話中執行,會話儲存了它所執行的圖的狀態:

將 tf.Session() 作為會話:
  initialization = tf.global_variables_initializer()
  print(y.eval())

在使用 tf.Variable 時,您必須在會話開始時呼叫 tf.global_variables_initializer,以明確初始化這些變數,如上所示。

**注意:**會話可以將圖分發到多個機器上執行(假設程式在某個分散式計算框架上執行)。有關詳情,請參閱分散式 TensorFlow

總結

TensorFlow 程式設計本質上是一個兩步流程:

  1. 將常量、變數和指令整合到一個圖中。
  2. 在一個會話中評估這些常量、變數和指令。

建立一個簡單的 TensorFlow 程式

我們來看看如何編寫一個將兩個常量相加的簡單 TensorFlow 程式。

新增 import 語句

與幾乎所有 Python 程式一樣,您首先要新增一些 import 語句。
當然,執行 TensorFlow 程式所需的 import 語句組合取決於您的程式將要訪問的功能。至少,您必須在所有 TensorFlow 程式中新增 import tensorflow 語句:

import tensorflow as tf

請勿忘記執行前面的程式碼塊(import 語句)。

其他常見的 import 語句包括:

import matplotlib.pyplot as plt   # 資料集視覺化。
import numpy as np                    # 低階數字 Python 庫。
import pandas as pd                  # 較高級別的數字 Python 庫。

TensorFlow 提供了一個預設圖。不過,我們建議您明確建立自己的 Graph,以便跟蹤狀態(例如,您可能希望在每個單元格中使用一個不同的 Graph)。

from __future__ import print_function

import tensorflow as tf

# Create a graph.
g = tf.Graph()

# Establish the graph as the "default" graph.
with g.as_default():
  # Assemble a graph consisting of the following three operations:
  #   * Two tf.constant operations to create the operands.
  #   * One tf.add operation to add the two operands.
  x = tf.constant(8, name="x_const")
  y = tf.constant(5, name="y_const")
  sum = tf.add(x, y, name="x_y_sum")


  # Now create a session.
  # The session will run the default graph.
  with tf.Session() as sess:
    print(sum.eval())

練習:引入第三個運算數

修改上面的程式碼列表,以將三個整數(而不是兩個)相加:

  1. 定義第三個標量整數常量 z,併為其分配一個值 4
  2. sumz 相加,以得出一個新的和。

**提示:**請參閱有關 tf.add() 的 API 文件,瞭解有關其函式簽名的更多詳細資訊。

  1. 重新執行修改後的程式碼塊。該程式是否生成了正確的總和?
# Create a graph.
g = tf.Graph()

# Establish our graph as the "default" graph.
with g.as_default():
  # Assemble a graph consisting of three operations. 
  # (Creating a tensor is an operation.)
  x = tf.constant(8, name="x_const")
  y = tf.constant(5, name="y_const")
  sum = tf.add(x, y, name="x_y_sum")
  
  # Task 1: Define a third scalar integer constant z.
  z = tf.constant(4, name="z_const")
  # Task 2: Add z to `sum` to yield a new sum.
  new_sum = tf.add(sum, z, name="x_y_z_sum")

  # Now create a session.
  # The session will run the default graph.
  with tf.Session() as sess:
    # Task 3: Ensure the program yields the correct grand total.
    print(new_sum.eval())