tensorflow_cookbook--第1章 TensorFlow入门
Google的TensorFlow引擎具有独特的解决问题的方法。 这种独特的方式允许我们非常有效地解决机器学习问题。 机器学习几乎在使用所有的生活和工作领域,但一些更着名的领域是计算机视觉,语音识别,语言翻译和医疗保健。 我们将介绍基本步骤,以了解TensorFlow如何运行,并最终在本书后面建立生产代码技术。 这些基础知识对于了解本书其余部分的内容很重要。
How TensorFlow Works?
首先,TensorFlow中的计算可能看起来不必要的复杂。 但是有一个原因:由于TensorFlow如何处理计算,开发更复杂的算法比较容易。 该内容将引导我们通过TensorFlow算法的伪代码。
Getting ready:
目前,Linux,Mac和Windows都支持TensorFlow。本书的代码已经在Linux系统上创建并运行,但是也应该在其他系统上运行。该书的代码可在GitHub上获取,网址为https://github.com/nfmcclure/tensorflow_ cookbookTensorFlow。在本书中,我们将仅关注TensorFlow的Python库包装器,尽管TensorFlow的大部分原始核心代码都是用C ++编写的。本书将使用Python 3.4+(https://www.python.org)和TensorFlow 0.12(https://www.tensorflow.org)。 TensorFlow在cial GitHub网站上提供了一个1.0.0 alpha版本,本书中的代码已经被审查以与该版本兼容。虽然TensorFlow可以在CPU上运行,但是如果在GPU上处理,则大多数算法运行得更快,并且在具有Nvidia Compute Capability v4.0 +(推荐使用v5.1)。 TensorFlow的热门GPU是Nvidia Tesla架构和具有至少4 GB视频RAM的Pascal架构。要在GPU上运行,您还需要下载并安装Nvidia Cuda Toolkit以及v 5.x +(https://developer.nvidia.com/cuda-downloads)。一些配方将依赖于当前安装的Python包:Scipy,Numpy和Scikit-Learn。这些附带的软件包也都包含在Anaconda软件包(https://www.continuum.io/downloads)中。
How to do it...:
这里我们将介绍TensorFlow算法的一般流程。 大多数内容将遵循这个大纲:
1.导入或生成数据集:我们所有的机器学习算法将依赖于数据集。 在本书中,我们将生成数据或使用外部数据集源。 有时最好依靠生成的数据,因为我们只想知道预期的结果。 大多数情况下,我们将访问给定食谱的公共数据集,有关访问这些信息的详细信息,请参见本章第8节。 2.转换和归一化数据:通常,输入数据集不会以TensorFlow的形式出现,因此我们需要将TensorFlow转换为接受的形状。 数据通常不在我们的算法期望的正确维度或类型。 我们将不得不转换我们的数据,然后才能使用它。 大多数算法也期望归一化数据,我们也将在这里做。 TensorFlow具有内置函数,可以为您规范数据,如下所示:
data = tf.nn.batch_norm_with_global_normalization(...)
3.将数据集划分为训练集,测试和验证集:我们通常希望在我们接受过培训的不同集上测试我们的算法。 此外,许多算法需要超参数调整,因此我们放置一个验证集来确定最佳的超参数集。
4.设置算法参数(超参数):我们的算法通常具有一组在整个过程中保持不变的参数。 例如,这可以是我们选择的迭代次数,学习率或其他有效参数。 将这些一起初始化是很好的形式,因此读者或用户可以很容易地找到它们,如下所示:
learning_rate = 0.01
batch_size = 100
iterations = 1000
5.初始化变量和占位符:TensorFlow取决于知道它可以和不能修改什么。 TensorFlow将在优化期间修改/调整变量和权重/偏差,以最大限度地减少损失函数。 为了实现这一点,我们通过占位符来提供数据。 我们需要初始化这两个变量和占位符的大小和类型,以便TensorFlow知道预期。 TensorFlow还需要知道要预期的数据类型:对于本书的大部分,我们将使用float32。 TensorFlow还提供了float64和float16。 请注意,精度较高的字节会导致较慢的算法,但是我们使用的结果越少,精度越低。 请参阅以下代码:
a_var = tf.constant(42)
x_input = tf.placeholder(tf.float32, [None, input_size])
y_input = tf.placeholder(tf.float32, [None, num_classes])
6.定义模型结构:在我们拥有数据并初始化了变量和占位符后,我们必须对模型进行定义。 这是通过构建计算图来完成的。 TensorFlow选择哪些操作和价值必须是变量和占位符来达到我们的模型结果。 我们在第2章“TensorFlow方法”中的计算图中的运算中的计算图更详细地讨论了TensorFlow配方。 我们这个例子的模型将是一个线性模型:
y_pred = tf.add(tf.mul(x_input, weight_matrix), b_matrix)
7.声明损失函数:在定义模型之后,我们必须能够评估输出。 这是我们声明损失函数的地方。 损失函数非常重要,因为它告诉我们我们的预测与实际值有多远。 不同类型的损失函数将在第2章“TensorFlow方法”中的“实施反向传播配方”中进行了详细的探讨。
loss = tf.reduce_mean(tf.square(y_actual – y_pred))
8.初始化和训练模型:现在我们已经有了一切,我们需要创建一个图表的实例,通过占位符提供数据,并让TensorFlow更改变量以更好地预测我们的训练数据。 这是初始化计算图的一种方法:
with tf.Session(graph=graph) as session:
...
session.run(...)
...
#Note that we can also initiate our graph with:
session = tf.Session(graph=graph)
session.run(...)
9.评估模型:一旦我们建立并训练了模型,我们就应该通过一些具体的标准来评估新模型的效果。 我们对训练和测试集进行评估,这些评估将使我们看到该模型是否在t或以上。 我们将在以后的食谱中解决这些问题。
10.调整超参数:大多数情况下,我们将根据模型性能返回并更改一些超级参数。 然后,我们用不同的超参数重复上述步骤,并对验证集进行评估。
11.部署/预测新结果:了解如何对新的,未见的数据进行预测也很重要。
How it works...:
在TensorFlow中,我们必须在我们之前设置数据,变量,占位符和模型告诉程序训练和更改变量以改进预测。 TensorFlow通过计算图完成了这一点。 这些计算图是没有递归的有向图,这允许计算并行性。 我们为TensorFlow创建一个损失函数,以最小化。TensorFlow通过修改计算图中的变量来实现。 Tensor ow知道如何修改变量,因为它跟踪模型中的计算,并自动计算每个变量的梯度。 因此,我们可以看到进行更改以及尝试不同的数据源有多么容易。
See also:
可以浏览Tensor ow Python API部分的cial文档,网址为https://www.tensorflow.org/api_docs/python/ 还有以下教程:https://www.tensorflow.org/ tutorials /
Declaring Tensors:
Tensor是TensorFlow用于在计算图上操作的主要数据结构。 我们可以将这些张量声明为变量,并将它们作为占位符进行馈送。 首先我们必须知道如何创建张量。
Getting ready:
当我们创建一个张量并将其声明为一个变量时,TensorFlow在我们的计算图中创建了几个图形结构。 同样重要的是要指出,只要创建一个张量,TensorFlow就不会对计算图添加任何东西。 TensorFlow只有在创建可用的张量之后才能做到这一点。 有关更多信息,请参阅下一节变量和占位符。
How to do it...
这里我们将介绍在TensorFlow中创建张量的主要方法:
1. Fixed tensors:
创建零填充张量。 使用以下内容:
zero_tsr = tf.zeros([row_dim, col_dim])
创建1填充的张量。 使用以下内容:
ones_tsr = tf.ones([row_dim, col_dim])
创建一个常量填充的张量。 使用以下内容:
filled_tsr = tf.fill([row_dim, col_dim], 42)
从现有常数中创建张量。 使用以下内容:
constant_tsr = tf.constant([1,2,3])
**请注意,tf.constant()函数可用于将数值广播到数组中,通过写入tf.constant(42,[row_dim,col_dim])来模拟 tf.fill()的行为
2. Tensors of similar shape:
我们也可以根据其他张量的形状初始化变量,如下所示:
zeros_similar = tf.zeros_like(constant_tsr)
ones_similar = tf.ones_like(constant_tsr)
** 注意,由于这些张量依赖于先前的张量,我们必须按顺序初始化它们。 试图一次全部初始化所有张量将会导致错误。 请参阅下一章末尾有关变量和占位符的部分。
3. Sequence tensors:
ensorFlow允许我们指定包含定义的间隔的张量。 以下函数的行为与range()输出和numpy的linspace()输出非常相似。 请参阅以下功能:
linear_tsr = tf.linspace(start=0, stop=1, start=3)
所得到的张量是序列[0.0,0.5,1.0]。 注意这个功能包括指定的停止值。 请参阅以下功能:
nteger_seq_tsr = tf.range(start=6, limit=15, delta=3)
** 结果是序列[6,9,12]。 请注意,此功能不包括限制值。
4. Random tensors:
以下生成的随机数来自均匀分布:
randunif_tsr = tf.random_uniform([row_dim, col_dim],minval=0, maxval=1)
** 请注意,该随机均匀分布从包括最小值但不是maxval(minval <= x <maxval)的间隔中抽取。
要从正态分布得到一个随机抽样的张量,如下所示:
randnorm_tsr = tf.random_normal([row_dim, col_dim],mean=0.0, stddev=1.0)
还有一些时候,我们希望生成一定范围内保证的正常随机值。 truncated_normal()函数总是在指定均值的两个标准偏差内选择正常值。 请参阅以下内容:
runcnorm_tsr = tf.truncated_normal([row_dim, col_dim],mean=0.0, stddev=1.0)
我们也可能对数组的条目进行随机化。 为了实现这一点,有两个功能可以帮助我们:random_shuffle()和 random_crop()。 请参阅以下内容:
shuffled_output = tf.random_shuffle(input_tensor)
cropped_output = tf.random_crop(input_tensor, crop_size)
在本书的后面,我们将有兴趣随机裁剪大小(高,宽,3)的图像,其中有三个颜色光谱。 要修复cropped_output中的维度,您必须在该维度中给出最大尺寸:
cropped_image = tf.random_crop(my_image, [height/2, width/2,3])
How it works...:
一旦我们决定如何创建张量,那么我们也可以通过在Variable()函数中包裹张量来创建相应的变量,如下所示。 更多关于这一点在下一节:
my_var = tf.Variable(tf.zeros([row_dim, col_dim])
There's more...:
我们不限于内置功能。 我们可以使用函数convert_to_tensor()将任何numpy数组转换为Python列表,或将常量转换为张量。 请注意,如果我们希望推广函数内的计算,该函数也可以接受张量作为输入。 Using Placeholders and Variables: 占位符和变量是在TensorFlow中使用计算图的关键工具。 我们必须了解差异,什么时候最好地利用它们来实现我们的优势。
Getting ready: 使用数据最重要的区别之一是它是占位符还是变量。 变量是算法的参数,TensorFlow跟踪如何改变这些来优化算法。 占位符是 允许您提供特定类型和形状的数据的对象,并且取决于计算图的结果,例如计算的预期结果。
How to do it...:
创建变量的主要方法是使用Variable()函数,它将一张张量作为输入并输出一个变量。 这是声明,我们仍然需要初始化变量。 初始化是将变量与相应的方法放在计算图上。 以下是创建和初始化变量的示例:
my_var = tf.Variable(tf.zeros([2,3]))
sess = tf.Session()
initialize_op = tf.global_variables_initializer ()
sess.run(initialize_op)
要在创建和初始化变量之后查看计算图形的外观,请参阅此配方中的下一部分。
占位符只是将数据放入图表中。 占位符从会话中的feed_dict参数获取数据。 要在图表中放置占位符,我们必须对占位符执行至少 一个操作。 我们初始化图形,将x声明为占位符,并将其定义为x上的身份操作,它只返回x。 然后,我们创建数据以进入x占位符 并运行身份操作。 值得注意的是,TensorFlow不会在feed字典中返回一个自引用的占位符。 代码如下所示,结果图显示在下一 节
sess = tf.Session()
x = tf.placeholder(tf.float32, shape=[2,2])
y = tf.identity(x)
x_vals = np.random.rand(2,2)
sess.run(y, feed_dict={x: x_vals})
# Note that sess.run(x, feed_dict={x: x_vals}) will result in a self-referencing error.
How it works...:
将变量初始化为零张量的计算图如下所示:
在图1中,我们可以看到,只有一个变量,初始化为全零,计算图表的详细信息。 灰色阴影区域是涉及的操作和常数的非常详细的视图。 具有较少细节的主要计算图是右上角灰色区域外的较小图。 有关创建和可视化图形的更多详细信息,请参见第10章“将TensorFlow转换为生产”一节。
类似地,将numpy阵列馈入占位符的计算图可以在下面的例子中看到:
There's more...:
在计算图的运行期间,我们必须告诉TensorFlow何时初始化我们创建的变量。 必须通知TensorFlow可以初始化变量的时间。 虽然每个变量都有一个初始化器方法,但最常用的方法是使用helper函数,它是global_variables_initializer()。该函数在图形中创建一个初始化所有创建的变量的操作,如下所示:
initializer_op = tf.global_variables_initializer ()
但是,如果要根据初始化另一个变量的结果初始化一个变量,我们必须按照我们想要的顺序初始化变量,如下所示:
sess = tf.Session()
first_var = tf.Variable(tf.zeros([2,3]))
sess.run(first_var.initializer)
second_var = tf.Variable(tf.zeros_like(first_var))
# Depends on first_var
sess.run(second_var.initializer)
如要转载,请保持本文完整,并注明作者@machinelp和本文原始地址