TensorFlow-實踐方法

TensorFlow-實踐方法

本文將介紹TensorFlow並深入探討它提供的數學和機器學習庫。首先,我將在本文中描述TensorFlow框架背後的思想,結構的方式,關鍵組件等。在本文的最後,您將能夠在TensorFlow中編寫簡單的數值解算器代碼片段。

TensorFlow是用於構建機器學習模型的計算框架。它是由Jeff Dean領導的Google Brain的第二代系統。它於2017年初推出,它通過引入從可擴展性到構建生產就緒模型的眾多功能,打破了ML世界。

框架

TensorFlow-實踐方法

TensorFlow工具包層次結構

TensorFlow提供了各種不同的工具包,允許您以您喜歡的抽象級別編寫代碼。例如,您可以在Core TensorFlow(C ++)中編寫代碼並從Python代碼中調用該方法。您還可以定義應運行代碼的體系結構(CPU,GPU等)。在上面的層次結構中,您可以編寫代碼的最低級別是C ++或Python。這兩個級別允許您編寫數值程序來解決數學運算和方程。雖然這不是強烈建議用於構建機器學習模型,但它提供了各種數學庫,可以簡化您的任務。您可以編寫代碼的下一個級別是使用特定於TF的抽象方法,這些方法針對模型組件進行了高度優化。例如,使用 tf.layers方法你可以使用神經網絡的層。您可以使用tf.metrics方法構建模型並評估模型性能。最廣泛使用的級別是tf.estimator API,它允許您輕鬆地構建(訓練和預測)生產就緒模型。估算器API非常易於使用且經過優化。雖然它提供的靈活性較低,但它具備訓練和測試模型所需的一切。讓我們看一下estimator API的應用程序,僅使用三行代碼構建分類器。

import tensorflow as tf

# Set up a linear classifier.

classifier = tf.estimator.LinearClassifier(feature_columns)

# Train the model on some sample data.

classifier.train(input_fn=train_input_function, steps=2000)

# Use it to predict.

predictions = classifier.predict(input_fn=predict_input_function)

在本文中,我將使用Core TensorFlow(Python)編寫代碼。但在此之前,讓我討論TensorFlow中可用的數據類型。

數據類型

此框架中的基本數據類型是Tensor。張量是一個N維數據陣列。例如,您可以將標量(常量值,如整數2)稱為0維張量。矢量是一維張量,矩陣是二維張量。下圖詳細描述了張量的每個尺寸。

TensorFlow-實踐方法

Tensor Data Type

請注意上圖。變量x是使用tf.constant類聲明的張量

常量:常量是一個張量,其值根本無法改變。在第一個例子中,x取常數值3,因此shape 為None。您可以使用tf.stack函數在現有張量上堆疊張量來聲明任何尺寸張量,這可以從nD Tensor的示例中看出。

現在我們已經看到如何在TensorFlow中聲明常量,讓我們看一下聲明變量。

變量:變量是一個張量,其值已初始化,然後通常在程序運行時更改。在TensorFlow中,變量由tf.Variable類操縱。創建變量的最佳方法是調用tf.get_variable函數。此函數要求您指定變量的名稱。此名稱將由其他副本用於訪問同一變量,以及在檢查指向和導出模型時命名此變量的值。tf.get_variable還允許您重用以前創建的同名變量,從而可以輕鬆定義重用層的模型。

my_variable = tf.get_variable("my_variable", [1, 2, 3])

初始化變量:作為一個低級的API,在使用時,需要顯式地初始化變量。如果喜歡高層次的框架tf.Estimator或Keras,變量將自動被初始化。要初始化變量,需要調用tf.global_variables_initializer。您可以使用以下代碼行初始化會話中的所有變量。

session.run(tf.global_variables_initializer())

但session.run是什麼? ?session是什麼?

會話和圖表(Sessions and Graphs)

會話封裝TensorFlow運行時的狀態,並運行TensorFlow操作。使用TensorFlow編寫的每一行代碼都由底層圖表表示。讓我們通過下面的例子來理解這一點。

session = tf.Session()

x = tf.constant([1, 2, 3], name = "x")

y = tf.constant([4, 5, 6], name = "y")

z1 = tf.add(x, y, name = "z1")

z2 = x * y

z3 = z2- z1

我創建了兩個1D張量x和y。我添加它們並將其存儲在名為z1的變量中。我將它們相乘並將其存儲在變量z2中。我通過從z2中減去z1來創建另一個變量z3。執行此特定代碼段時,TensorFlow 不會計算結果,但會創建表示上述代碼的圖形(如下所示)

TensorFlow-實踐方法

TensorFlow Graph

利用圖形背後的想法是創建可移植代碼。是的,任何人都可以在任何類型的體系結構中導出和使用此圖。但是,為什麼TensorFlow不計算結果呢?因為,它遵循懶惰的評估範式。創建的所有圖都與會話綁定,我們必須告訴TensorFlow使用session.run計算結果。

session.run(Z3)

記住這一點,如果tf.Graph就像一個 .py文件,那麼tf.Session就像是python可執行文件。

現在我們已經瞭解了會話,圖形,數據類型以及如何創建變量的基礎知識,讓我們通過編寫一些TensorFlow代碼來解決問題。

TensorFlow代碼

加減

import tensorflow as tf

a1 = tf.constant([1, 2, 3])

a2 = tf.constant([3, 4, 5])

a3 = a1 + a2 # (tf.add(a1, a2) also works. TensorFlow supports primitive operators)

with tf.Session() as session:

session.run(a3)

# Result

[4, 6, 8]

a4 = a1 - a2

with tf.Session() as session:

session.run(a4)

# Result

[-2, -2, -2]

乘法和除法

import tensorflow as tf

a1 = tf.constant([1, 2, 3])

a2 = tf.constant([3, 4, 5])

a3 = a1 * a2 # (tf.mul(a1, a2) also works. TensorFlow supports primitive operators)

with tf.Session() as session:

session.run(a3)

# Result

[3, 8, 15]

a4 = a1/a2

with tf.Session() as session:

a4.eval() # eval() can be used instead of session.run() to compute the results of a particular variable.

# Result

[0.34, 0.5, 0.6]

Reshaping

import tensorflow as tf

a1 = tf.constant([3, 5, 7],

[4, 6, 8]) # Shape is (2, 3)

a2 = tf.reshape(x, [3, 2])

with tf.Session() as sess:

sess.run(a2)

print(a2)

# Result

[[3, 5],

[7, 4],

[6, 8]]

結論

在本文中,我們瞭解了TensorFlow的結構和組件。


分享到:


相關文章: