本文將介紹TensorFlow並深入探討它提供的數學和機器學習庫。首先,我將在本文中描述TensorFlow框架背後的思想,結構的方式,關鍵組件等。在本文的最後,您將能夠在TensorFlow中編寫簡單的數值解算器代碼片段。
TensorFlow是用於構建機器學習模型的計算框架。它是由Jeff Dean領導的Google Brain的第二代系統。它於2017年初推出,它通過引入從可擴展性到構建生產就緒模型的眾多功能,打破了ML世界。
框架
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維張量。矢量是一維張量,矩陣是二維張量。下圖詳細描述了張量的每個尺寸。
請注意上圖。變量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使用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的結構和組件。
閱讀更多 不靠譜的貓 的文章