码迷,mamicode.com
首页 > 其他好文 > 详细

TensorFlow简明入门教程

时间:2018-03-14 15:51:32      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:origin   数据科学家   navigate   desktop   互连   集中   readme.md   测试数据   阅读   

技术分享图片

通过实践教程体验Google开源机器学习库的强大功能。

机器学习不能在热了,有几个重量级的针对经验丰富的数据科学家和对神经网络感兴趣的新手平台。TensorFlow是其中之一,TensorFlow是Google一年前开源的一个机器学习库。

在这篇文章中,我向你介绍TensorFlow的基础知识,并且为你讲解几个在图像分类领域的TensorFlow模型。然后,我会为你指出用于学习和使用TensorFlow的其他资源。

先决条件

你需要一些先决条件来充分理解我将要讲述的内容。首先,你应该能够读取Python代码。如果你不知道怎么做,Mark Lutz的书“Learning Python”非常出色; 为了在网上更快速,免费的介绍,请尝试使用Python for Beginners或Learn Python。

其次,你应该知道一些关于微积分和基本统计学的知识。大多数程序员在大学甚至高中时都会学到这些东西,但是如果你对我将要使用的任何概念都生疏的话,网络上就有很多资源,比如Calculus for Beginners 和Usable Stats。

如果你了解gradient-based optimization methods,这也会有所帮助。 如果你不这样做,你可以把优化器当作黑盒来使用。。

快速介绍:机器学习,神经网络和深度学习

在传统的编程中,我们明确告诉计算机如何处理其输入数据,包括响应数据条件的各种程序分支。另一方面,在机器学习中,我们给计算机一些数据,数据模型,模型条件的权重和偏差,定义模型“损失”或“成本”的函数,以及优化算法通过调整权重和偏差来“训练”模型以找到最小损失。

一旦计算机从初始数据的训练中找到最佳模型,我们可以使用该模型来预测新数据的值。如果数据随时间变化,我们可能需要定期重新训练模型,以保证数据的准确性。

我们通常将初始数据分成两组或三组:培训数据,测试数据,以及可选的验证数据。数据可能是连续的(实数),在这种情况下,我们将解决回归问题来预测响应,或者它可能是离散的(整数或类标签),在这种情况下,我们将解决分类问题。

人工神经网络是实现机器学习的众多方法之一,它是一个由相互连接的一组节点组成的模型,通常具有输入层,输出层以及其间的一个或多个隐藏层。现在,每个节点通常是一个“S形”神经元,意味着它的激活函数在“S”形曲线的0和1之间平滑地变化,这比旧的“感知器”的二进制步进函数提供了更稳定的行为。

技术分享图片

通常具有输入层,输出层以及其间的一个或多个隐藏层的人工神经网络。

深度学习的核心是一个具有多个隐藏层的神经网络,即深度神经网络。 深度网络有很多种类, 其中最常用的是深度卷积网络,它对图像识别非常有效。 在你探索TensorFlow时,你将阅读关于这种以及其他类型的深度神经网络,例如循环神经网络(RNN),这对于语音识别非常方便。 有很多方法可以使深度神经网络的损失最小化,我们将在我们尝试一些示例时讨论其中的几个。

你可以从Michael Nielsen关于这个主题的免费电子书中学到更多关于神经网络和深度学习的介绍性知识。 Ian Goodfellow,Yoshua Bengio和Aaron Courville的深度学习提供了更多的技术概述。

技术分享图片

TensorFlow Playground可以帮助你获得使用神经网络的感觉。

Playground允许你尝试解决四个分类问题和一个回归问题,使用自己的特征选择选项,用于创建预测模型的属性;神经元激活功能,定义你的模式的输出;以及每层中隐藏层的数量和神经元的数量,以确定你的网络应该有多深。你还可以调整每次迭代训练数据的批处理大小,训练与测试数据的比率,训练模型的学习率,正则化类型和正则化率。尝试各种策略,看看你可以得到每个问题的损失,每个问题需要多长时间才能收敛。

一旦你认为从Playground中得到了神经网络的感觉(即使它存在于TensorFlow存储库中,它实际上并不基于TensorFlow),现在是时候从GitHub中检查TensorFlow源代码了。

技术分享图片

可以从TensorFlow GitHub存储库检出TensorFlow。

这个GitHub页面底部的README.md文件有很好的概述和有用的链接。

我喜欢用GitHub Desktop克隆,但任何Git客户端都可以工作,其他方法也可以使用:

技术分享图片

克隆TensorFlow以开始在自己的机器上使用TensorFlow。

TensorFlow支持机器学习,神经网络和数据流图的更大范围内的深度学习。这些图形以比Playground更复杂但更灵活,更通用,更高效的方式描述模型的计算网络。 TensorFlow解决方案的代码首先加载数据并构建图形,然后建立会话并根据数据运行模型的训练。

正如你在编程编辑器中打开TensorFlow存储库或浏览GitHub上的代码时看到的那样,TensorFlow的核心在C ++中实现,并具有可选的GPU支持。它使用线性代数(XLA)的域特定编译器来JIT编译TensorFlow计算(数据流图)的子图。支持谷歌张量处理单元(TPU)的XLA版本目前尚未开源,它使用自定义代码生成;开源CPU和GPU后端目前使用LLVM。

TensorFlow和主TensorFlow API的更高层是在Python中实现的。虽然有一个C ++ API,但它只实现了Python API支持的一个子集。

技术分享图片

TensorFlow README.md文件提供了一个可靠的概述和有用的链接。

在浏览TensorFlow存储库时,请特别注意示例目录。 我们将回到示例来了解特定的TensorFlow应用程序。

安装TensorFlow

可以在本地安装TensorFlow或使用云。也许可以使用TensorFlow的最强大的方法是设置一个启用了云计算机学习,云数据流,计算引擎,云日志记录,云存储,云存储JSON和BigQuery API的Google云平台项目,然后建立一个环境(Cloud Mac),Docker容器(Mac OS,Linux或Windows)或本地(Mac OS或Linux)上的Cloud ML。

但为了入门,我认为你应该先在本地安装TensorFlow。如果使用的是Mac OS或Linux,我会建议使用pip安装;对于Windows,必须使用其中一个Docker镜像来本地安装。当使用Docker镜像来训练模型时,应该将大部分计算机的RAM和内核分配给Docker,然后关闭Docker以在完成时释放资源。

在安装过程中,可以选择CPU或GPU版本。在使用Nvidia芯片的机器上,GPU版本的运行速度要快得多,但要正确安装却要困难得多;我建议首先安装一个CPU专用的二进制文件。

在pip安装步骤中,可能会遇到卸载旧版本的权限错误:

$ sudo pip install -upgrade $ TF_BINARY_URL

如果发生这种情况,请添加开关以忽略已安装的版本:

$ sudo pip install -upgrade -ignore-installed $ TF_BINARY_URL

下一步是验证安装。我建议复制一行一行的Python代码;如果会出现问题,那么当Python尝试导入张量流时很可能会发生这种情况:

>>>import tensorflow as tf

当你完成Python会话时,exit()会让你回到shell。

如果要完全测试安装,请运行TensorFlow存储库中的convolutional.py演示程序,该程序将花费大约半个小时的时间来训练一个适度简单的卷积神经网络模型,以从标准MNIST数据集中识别手写数字:

$ python -m tensorflow.models.image.mnist.convolutional

虽然这是训练,让你的电脑风扇加速,你可能想要阅读更多关于发生了什么事情。让我们从支持TensorFlow架构的数据流图开始。

了解数据流图

技术分享图片

数据流图是具有节点和边的有向图,节点之间流向一个方向。

数据流图是一种描述数学计算的有向图。如果你对有向图不熟悉,那么你真正需要知道的是,它们是具有节点和边的图,并且边从一个节点到另一个节点在一个方向上流动(定向)。

在数据流图中,节点表示数学运算,或者输入数据,推出结果或读/写持久变量的端点。边表示节点之间的输入/输出关系,并携带动态大小的多维数据阵列,也称为张量。

在TensorFlow(以边缘张量流命名)中,可以将每个节点分配给一个计算设备,一旦所有张量的输入边上的张量变得可用,节点就异步并行执行。正如我前面提到的,TensorFlow模型加载数据,创建数据流图,建立会话并在会话中运行培训。会话调用即时编译器(XLA)以从数据流图生成代码。

如上图所示,神经权重W和偏移量b出现在多个位置:以整流线性单位(ReLu)和概率对数(Logit)神经元层数作为输入,以随机梯度下降(SGD)培训层作为输出。这是循环的,所以网络需要迭代解决。 Softmax和Cross熵节点计算损失,Gradients节点自动计算相对于权重和偏移的损失的偏导数,以馈入SGD培训师。

为了更清楚地说明,我们来看看Python中的一个具体示例。

了解如何使用TensorFlow

TensorFlow作者为初学者提供的教程是对MNIST手写数字数据集的一个非常简单的Softmax回归分类器的慢节奏介绍。 与我们之前运行的用于验证TensorFlow安装的卷积模型相比,对数字进行分类是一种不同甚至更糟糕的方式。 然而,理解起来要容易得多。

我建议你阅读我的解释,然后在阅读官方教程的同时自己运行模型。 我们正在讨论的Python程序位于TensorFlow存储库中的tensorflow / examples / tutorials / mnist / mnist_softmax.py。

你可以安全地跳过前几个步骤, 接下来是数据读取代码导入:

技术分享图片

这实际上牵扯到其他几个程序文件,当我们调用它时,它将下载官方的MNIST培训,测试和验证图像数据。 本教程详细解释了数据。

下一个代码导入tensorflow库模块,给它起一个名字tf,并清除所有的标志。 在使用之前,你总是需要导入张量流。

技术分享图片

现在我们来看一下可执行代码。 首先,我们使用我们在第28行导入的代码读入数据:

技术分享图片

这将需要几秒钟,然后输出:‘’

Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.

Extracting /tmp/data/train-images-idx3-ubyte.gz

Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.

Extracting /tmp/data/train-labels-idx1-ubyte.gz

Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.

Extracting /tmp/data/t10k-images-idx3-ubyte.gz

Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.

Extracting /tmp/data/t10k-labels-idx1-ubyte.gz

现在我们已经加载了数据,我们使用TensorFlow变量,占位符和函数创建一个模型。 它只不过是矩阵方程y = Wx + b,再加上一些设置来保存张量(784是28乘28,以保持图像的像素; 10是类别的数量,数字0-9)。

 

技术分享图片

然后,我们定义一个损失函数 - 我们定义模型的“拟合优度”或者说“拟合度差”的方式,并选择优化器用于训练。

技术分享图片

正如你可以在代码和注释中看到的那样,损失函数是基于Softmax(归一化指数)函数的平均交叉熵,训练方法是梯度下降,以使交叉熵损失函数最小化。

最后,我们准备实际运行一个TensorFlow会话。 你会注意到训练是在一个循环内逐批进行的。

技术分享图片

现在训练已经完成(只需要一秒钟),我们需要测试模型并计算精度:

技术分享图片

我得到的准确度输出是0.9109,即91%,这与MNIST分类器不一样好。 然而,这里的要点是了解步骤。

现在,你可以尝试:在终端中,导航到TensorFlow存储库中的tensorflow / examples / tutorials / mnist /,然后运行

$ python mnist_softmax.py

现在去阅读完整的教程,这将更详细。 请注意,它使用比存储库中的Python代码稍微简单的交叉熵丢失函数,并解释了为什么上面的代码在括号内需要。 你回来的时候我会在这里的。

在TensorBoard中可视化模型

TensorBoard是一套可视化工具,用于查看TensorFlow图形和绘图指标,以及其他一些有用的任务。 在你使用TensorBoard之前,你需要从TensorFlow运行生成数据文件。

在我们刚才使用的文件夹tensorflow / examples / tutorials / mnist /中,你会发现另一个MNIST分类程序mnist_with_summaries.py。 如果你仔细阅读代码,你会发现熟悉的代码以及可能对你来说是新的代码,例如,使用tf.name_scope来阐明我们将在TensorBoard中看到的内容,以及variable_summaries函数:

技术分享图片

正如评论所说,这是一个张量很多的总结。 如果你仔细阅读了mnist_with_summaries.py,你会看到很多包含对variable_summaries(var,name)的调用的tf.name_scope(name)子句和其他特定的tf。<x> _summary函数,比如上面显示的函数。

注意模型和优化器。 如果仔细阅读代码,你将看到一些ReLu神经元和一个自适应矩估计(Adam,梯度下降的变体)优化器。 你还会看到我们在mnist_softmax教程中找到的相同交叉熵定义。

继续并运行模型:

$ python mnist_with_summaries.py

这将需要不到一分钟的时间。 当我跑它时,最后几行输出是:

Accuracy at step 950: 0.9664

Accuracy at step 960: 0.9669

Accuracy at step 970: 0.9671

Accuracy at step 980: 0.9671

Accuracy at step 990: 0.9663

Adding run metadata for 999

现在我们可以试试TensorBoard,指定模型保存日志的文件夹:

$ tensorboard —logdir=/tmp/mnist_logs/

Starting TensorBoard 23 on port 6006

(You can navigate to http://0.0.0.0:6006)

一旦在浏览器中打开该URL,就会在终端窗口中看到大量的Web服务器日志记录,只需点击几下鼠标,就可以在事件窗格中看到收敛图形:

技术分享图片

再点击几下,可以查看图表并放大感兴趣的部分:

技术分享图片

额外的资源

有更多的材料值得学习,例如,将MNIST数据与Softmax模型一起作为MNIST初学者教程的一部分进行讨论。后续的“专家”教程再次覆盖了一些相同的材料,速度更快,然后向你展示如何创建一个多层卷积神经网络,以将结果提高到99.2%的准确度。 TensorFlow Mechanics 101教程更深入,仍然使用MNIST数据。如果你想要去MNIST的源头,它就住在Courant Institute的Yann LeCun维护的页面上。如果你想探索用于分类MNIST数据的技术,Chris Olah有一个可视化页面。

MNIST是用于视觉分类研究的较为简单的基准数据集之一,在70,000 B&W 28-28的手写数字0-9的图像中。另一组图像CIFAR-10用于对10个类别的60,000个RGB 32×32像素图像进行分类,从而对图像处理技术进行基准测试。卷积神经网络教程向您展示了如何构建一个用于分类CIFAR-10图像的小型CNN。如果你要试试这个模型,你至少需要一个GPU,这会把训练时间缩短到几个小时。如果你拥有多个GPU,则可以使用它们来改变模型。

除了图像处理之外,你可能还想了解使用词嵌入,递归神经网络(RNN),序列--序列模型和SyntaxNet的自然语言处理。你也可以试试tf.contrib.learn,TensorFlow的高级机器学习API。最后,Google研究博客中的TensorFlow Model Zoo和TensorFlow文章应该值作为自己模型的出发点。

http://www.aibbt.com/a/21940.html

TensorFlow简明入门教程

标签:origin   数据科学家   navigate   desktop   互连   集中   readme.md   测试数据   阅读   

原文地址:https://www.cnblogs.com/aibbt/p/8567930.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!