前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >01 TensorFlow入门(1)

01 TensorFlow入门(1)

作者头像
MachineLP
发布2018-01-09 14:43:08
1.5K0
发布2018-01-09 14:43:08
举报
文章被收录于专栏:小鹏的专栏小鹏的专栏

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具有内置函数,可以为您规范数据,如下所示:

代码语言:javascript
复制
data = tf.nn.batch_norm_with_global_normalization(...)

3.将数据集划分为训练集,测试和验证集:我们通常希望在我们接受过培训的不同集上测试我们的算法。 此外,许多算法需要超参数调整,因此我们放置一个验证集来确定最佳的超参数集。

4.设置算法参数(超参数):我们的算法通常具有一组在整个过程中保持不变的参数。 例如,这可以是我们选择的迭代次数,学习率或其他有效参数。 将这些一起初始化是很好的形式,因此读者或用户可以很容易地找到它们,如下所示:

代码语言:javascript
复制
learning_rate = 0.01
batch_size = 100
iterations = 1000

  5.初始化变量和占位符:TensorFlow取决于知道它可以和不能修改什么。 TensorFlow将在优化期间修改/调整变量和权重/偏差,以最大限度地减少损失函数。 为了实现这一点,我们通过占位符来提供数据。 我们需要初始化这两个变量和占位符的大小和类型,以便TensorFlow知道预期。 TensorFlow还需要知道要预期的数据类型:对于本书的大部分,我们将使用float32。 TensorFlow还提供了float64和float16。 请注意,精度较高的字节会导致较慢的算法,但是我们使用的结果越少,精度越低。 请参阅以下代码:

代码语言:javascript
复制
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配方。 我们这个例子的模型将是一个线性模型:

代码语言:javascript
复制
y_pred = tf.add(tf.mul(x_input, weight_matrix), b_matrix)

7.声明损失函数:在定义模型之后,我们必须能够评估输出。 这是我们声明损失函数的地方。 损失函数非常重要,因为它告诉我们我们的预测与实际值有多远。 不同类型的损失函数将在第2章“TensorFlow方法”中的“实施反向传播配方”中进行了详细的探讨。

代码语言:javascript
复制
loss = tf.reduce_mean(tf.square(y_actual – y_pred))

8.初始化和训练模型:现在我们已经有了一切,我们需要创建一个图表的实例,通过占位符提供数据,并让TensorFlow更改变量以更好地预测我们的训练数据。 这是初始化计算图的一种方法:

代码语言:javascript
复制
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:

                创建零填充张量。 使用以下内容:

代码语言:js
复制
 zero_tsr = tf.zeros([row_dim, col_dim])

                创建1填充的张量。 使用以下内容:

代码语言:js
复制
 ones_tsr = tf.ones([row_dim, col_dim])

                创建一个常量填充的张量。 使用以下内容:

代码语言:js
复制
 filled_tsr = tf.fill([row_dim, col_dim], 42)

                从现有常数中创建张量。 使用以下内容:

代码语言:js
复制
 constant_tsr = tf.constant([1,2,3])
 

**请注意,tf.constant()函数可用于将数值广播到数组中,通过写入tf.constant(42,[row_dim,col_dim])来模拟 tf.fill()的行为

 2. Tensors of similar shape:

                我们也可以根据其他张量的形状初始化变量,如下所示:

代码语言:js
复制
 zeros_similar = tf.zeros_like(constant_tsr)
 ones_similar = tf.ones_like(constant_tsr)
  

** 注意,由于这些张量依赖于先前的张量,我们必须按顺序初始化它们。 试图一次全部初始化所有张量将会导致错误。 请参阅下一章末尾有关变量和占位符的部分。

        3. Sequence tensors:

                ensorFlow允许我们指定包含定义的间隔的张量。 以下函数的行为与range()输出和numpy的linspace()输出非常相似。                 请参阅以下功能:

代码语言:js
复制
 linear_tsr = tf.linspace(start=0, stop=1, start=3)

                所得到的张量是序列[0.0,0.5,1.0]。 注意这个功能包括指定的停止值。 请参阅以下功能:

代码语言:js
复制
 nteger_seq_tsr = tf.range(start=6, limit=15, delta=3)

                ** 结果是序列[6,9,12]。 请注意,此功能不包括限制值。

        4. Random tensors:

                以下生成的随机数来自均匀分布:

代码语言:js
复制
 randunif_tsr = tf.random_uniform([row_dim, col_dim],minval=0, maxval=1)
                ** 请注意,该随机均匀分布从包括最小值但不是maxval(minval <= x <maxval)的间隔中抽取。

                要从正态分布得到一个随机抽样的张量,如下所示:

代码语言:js
复制

 randnorm_tsr = tf.random_normal([row_dim, col_dim],mean=0.0, stddev=1.0)

                还有一些时候,我们希望生成一定范围内保证的正常随机值。 truncated_normal()函数总是在指定均值的两个标准偏差内选择正常值。 请参阅以下内容:

代码语言:js
复制
 runcnorm_tsr = tf.truncated_normal([row_dim, col_dim],mean=0.0, stddev=1.0)
                

我们也可能对数组的条目进行随机化。 为了实现这一点,有两个功能可以帮助我们:random_shuffle()和     random_crop()。 请参阅以下内容:

代码语言:js
复制

 shuffled_output = tf.random_shuffle(input_tensor)
 cropped_output = tf.random_crop(input_tensor, crop_size)

                在本书的后面,我们将有兴趣随机裁剪大小(高,宽,3)的图像,其中有三个颜色光谱。 要修复cropped_output中的维度,您必须在该维度中给出最大尺寸:

代码语言:js
复制
 cropped_image = tf.random_crop(my_image, [height/2, width/2,3])
 

How it works...:

一旦我们决定如何创建张量,那么我们也可以通过在Variable()函数中包裹张量来创建相应的变量,如下所示。 更多关于这一点在下一节:

代码语言:js
复制

 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()函数,它将一张张量作为输入并输出一个变量。 这是声明,我们仍然需要初始化变量。 初始化是将变量与相应的方法放在计算图上。 以下是创建和初始化变量的示例:

代码语言:js
复制

 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字典中返回一个自引用的占位符。 代码如下所示,结果图显示在下一           节                

代码语言:js
复制
 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()。该函数在图形中创建一个初始化所有创建的变量的操作,如下所示:

代码语言:js
复制
 initializer_op = tf.global_variables_initializer ()

        但是,如果要根据初始化另一个变量的结果初始化一个变量,我们必须按照我们想要的顺序初始化变量,如下所示:

代码语言:js
复制
 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和本文原始地址

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年04月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
语音识别
腾讯云语音识别(Automatic Speech Recognition,ASR)是将语音转化成文字的PaaS产品,为企业提供精准而极具性价比的识别服务。被微信、王者荣耀、腾讯视频等大量业务使用,适用于录音质检、会议实时转写、语音输入法等多个场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档