1. 程式人生 > >TensorFlow入門(一) TensorFlow計算模型——計算圖

TensorFlow入門(一) TensorFlow計算模型——計算圖

1.1 TensorFlow計算模型——計算圖

計算圖是TensorFlow中最基本的一個概念,TensorFlow中的所有計算都會被轉為計算圖上的節點。

1.1.1 計算圖的概念

Tensor就是張量,可以簡單理解為多維陣列。Tensor表明了它的資料結構,而Flow體現了它的計算模型。Flow翻譯成中文就是“流”,它直觀地表達了張量之間通過計算相互轉化的過程。TensorFlow是一個通過計算圖的形式來表述計算的程式設計系統。TensorFlow中的每一個計算都是計算圖上的一個節點,而節點之間描述了計算之間的依賴關係。

1.1.2 計算圖的使用

TensorFlow程式一般可以分為兩個階段。在第一個階段需要定義計算圖中的所有的計算,第二個階段為執行計算。計算定義階段的樣例如下:

import tensorflow as tf
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
result = a + b

在這個過程中,TensorFlow會自動將定義的計算轉為計算圖上的節點。在TensorFlow程式中,系統會自動維護一個預設的計算圖,通過tf.get_default_graph函式可以獲取當前預設的計算圖。

# 通過a.graph 可以檢視張量所屬的計算圖。因為沒有特意指定,所以
# 這個計算圖應該等於當前預設的計算圖。所以下面這個操作輸出值為True

print(a.graph is tf.get_default_graph())

除了使用預設的計算圖,TensorFlow支援通過tf.Graph函式來生成新的計算圖。不同計算圖上的張量和運算不會共享。以下程式碼示意瞭如何在不同計算圖上定義和使用變數。

import tensorflow as tf

g1 = tf.Graph()
with g1.as_default():
    # 在計算圖g1中定義變數"v",並設初始值為0。
    v = tf.get_variable(
        "v", initialize=tf.ones_initializer(shape=[1]))

g2 = tf.Graph()
with g2.as_default():
    # 在計算圖g2中定義變數"v",並設定初始值為0。
    v = tf.get_variable(
        "v", initialize=tf.ones_initializer(shape=[1]))

# 在計算圖g1中讀取變數"v"的取值。
with tf.Session(graph=g1) as sess:
    tf.initialize_all_variables().run()
    with tf.variable_scope("", reuse=True):
        # 在計算圖g1中,變數"v"的取值應為0,所以下面這行會輸出[0.]
        print(sess.run(tf.get_variable("v"))

# 在計算圖g2中讀取變數"v"的取值。
with tf.Session(graph=g1) as sess:
    tf.initialize_all_variables().run()
    with tf.variable_scope("", reuse=True):
        # 在計算圖g2中,變數"v"的取值應為0,所以下面這行會輸出[1.]
        print(sess.run(tf.get_variable("v"))

上面的程式碼產生了兩個計算圖,每個計算圖中定義了一個名字為"v"的變數。在計算圖g1中,將v初始化為0;在計算圖g2中,將v初始化為1。可以看到當執行不同計算圖時,變數v的值也是不一樣的。TensorFlow中的計算不僅僅可以用來隔離張量和計算,它還提供了管理張量和計算的機制。計算圖可以通過tf.Graph.device函式來指定執行計算的裝置。這為TensorFlow使用GPU提供了機制。下面的程式可以將加法計算跑在GPU上。

g = tf.Graph()
# 指定計算執行的裝置
with g.device('/gpu:0'):
    result = a + b