01 TensorFlow入门(1)

本文介绍了TensorFlow的基础知识,包括其独特的解决问题方式及其在机器学习领域的应用。文章详细阐述了TensorFlow的工作原理、如何设置算法参数、声明损失函数等关键步骤,并提供了创建张量、使用变量和占位符的具体示例。
部署运行你感兴趣的模型镜像


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和本文原始地址: http://blog.csdn.net/u014365862/article/details/70837638

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值