白话深度学习 2018-07-08
本文将介绍TensorFlow并深入探讨它提供的数学和机器学习库。首先,我将在本文中描述TensorFlow框架背后的思想,结构的方式,关键组件等。在本文的最后,您将能够在TensorFlow中编写简单的数值解算器代码片段。
TensorFlow是用于构建机器学习模型的计算框架。它是由Jeff Dean领导的Google Brain的第二代系统。它于2017年初推出,它通过引入从可扩展性到构建生产就绪模型的众多功能,打破了ML世界。
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维张量。矢量是一维张量,矩阵是二维张量。下图详细描述了张量的每个尺寸。
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是什么?
会话封装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 Graph
利用图形背后的想法是创建可移植代码。是的,任何人都可以在任何类型的体系结构中导出和使用此图。但是,为什么TensorFlow不计算结果呢?因为,它遵循懒惰的评估范式。创建的所有图都与会话绑定,我们必须告诉TensorFlow使用session.run计算结果。
session.run(Z3)
记住这一点,如果tf.Graph就像一个 .py文件,那么tf.Session就像是python可执行文件。
现在我们已经了解了会话,图形,数据类型以及如何创建变量的基础知识,让我们通过编写一些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的结构和组件。