TensorFlow-实践方法

白话深度学习 2018-07-08

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的结构和组件。

相关推荐