01 TensorFlow入门(1)

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和本文原始地址

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术墨客

TensorFlow入门 原

本文将初步向码农和程序媛们介绍如何使用TensorFlow进行编程。在阅读之前请先 安装TensorFlow,此外为了能够更好的理解本文的内容,阅读之前需要了解...

1152
来自专栏机器之心

教程 | 经典必读:门控循环单元(GRU)的基本概念与原理

5007
来自专栏WindCoder

TensorFlow入门:一篇机器学习教程

TensorFlow是一个由Google创建的开源软件库,用于实现机器学习和深度学习系统。这两个名称包含一系列强大的算法,它们共享一个共同的挑战——让计算机学习...

3791
来自专栏desperate633

LintCode 最小路径和题目分析代码

给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。

702
来自专栏深度学习入门与实践

【深度学习系列】PaddlePaddle之数据预处理

  上篇文章讲了卷积神经网络的基本知识,本来这篇文章准备继续深入讲CNN的相关知识和手写CNN,但是有很多同学跟我发邮件或私信问我关于PaddlePaddle如...

2658
来自专栏大学生计算机视觉学习DeepLearning

手指静脉细化算法过程原理解析 以及python实现细化算法

4845
来自专栏PPV课数据科学社区

使用R语言进行异常检测

本文结合R语言,展示了异常检测的案例,主要内容如下: (1)单变量的异常检测 (2)使用LOF(local outlier factor,局部异常因子)进行异常...

3906
来自专栏ATYUN订阅号

四个用于Keras的很棒的操作(含代码)

Keras是最广泛使用的深度学习框架之一。它在易于使用的同时,在性能方面也与TensorFlow,Caffe和MXNet等更复杂的库相当。除非你的应用程序需要一...

2124
来自专栏机器学习算法工程师

Tensorflow快速入门

作者:叶 虎 编辑:李文臣 PART 01 Tensorflow简介 引言 实践深度学习肯定要至少学习并掌握一个深度学习框架。这里我们介绍一个最流行的深度学习框...

4659
来自专栏开心的学习之路

神经网络体系搭建(四)——快速上手TensorFlow

本篇是神经网络体系搭建的第四篇,解决体系搭建的TensorFlow相关问题,详见神经网络体系搭建(序) ? TensorFlow安装 建议用Anacond...

3505

扫码关注云+社区

领取腾讯云代金券