TensorFlow和深度学习入门教程(TensorFlow and deep learning without a P

                                                                                                 

前言

上月导师在组会上交我们用tensorflow写深度学习和卷积神经 络,并把其PPT的参考学习资料给了我们, 这是codelabs上的教程:《TensorFlow and deep learning,without a PhD》
当然登入需要翻墙,我也顺带巩固下,做个翻译,不好之处请包含指正。

当然需要安装python,教程推荐使用python3。如果是Mac,可以参考博主的另外两片博文,Mac下升级python2.7到python3.6,
Mac安装tensorflow1.0

好多专业词太难译了,查了下,大家有些都是不译的。
比如:dropout,learning rate decay,pkeep什么的。。。。

dropout这个词应该翻译成什么/p>


1. 概述

该codelab使用MNIST数据集,收集了60,000个标记的数字。你将学会用不到100行Python / TensorFlow代码来解决深度学习问题。

你会学到什么

  • 什么是神经 络和如何训练它
  • 如何使用TensorFlow构建基本的1层神经 络
  • 如何添加更多的神经 络层数
  • 训练技巧和窍门:过度拟合(overfitting),丢失信息(dropout),学习速率衰退(learning rate decay)…
  • 如何排查深层神经 络的故障
  • 如何构建卷积神经 络(convolutional networks)

你需要什么

  • Python 2或3(推荐Python 3)
  • TensorFlow
  • Matplotlib(Python可视化库)

安装说明在实验室的下一步中给出。

如果你觉得这篇文章看起来稍微还有些吃力,或者想要系统地学习人工智能,那么推荐你去看床长人工智能教程。非常棒的大神之作,教程不仅通俗易懂,而且很风趣幽默。

2. 准备:安装TensorFlow,获取示例代码

在您的计算机上安装必要的软件:Python,TensorFlow和Matplotlib。这里给出了完整的安装说明:INSTALL.txt

从GitHub的信息库,克隆源代码(也可以直接登入这个 址,直接下载)

 

下载的文件夹中含多个文件。首先是让mnist_1.0_softmax.py运行起来。其他很多文件是用于加载数据和可视化结果的解决方案或支持代码。

当您启动初始python脚本时,您应该看到一个实时可视化的培训过程:

如果python3 mnist_1.0_softmax.py不起作用,用python命令:

疑难解答:如果无法使实时可视化运行,或者您只希望仅使用文本输出,则可以通过注释掉一行并取消注释另一行来取消激活可视化。请参阅下载文件的底部的说明。

 

为TensorFlow构建的可视化工具是TensorBoard。其功能比我们本次教程中所需要的更多。它可以在远程服务器上跟踪您的分布式TensorFlow作业。对于我们在这个实验中我们只需要matplotlib的结果,能看到训练过程的实时动画,就当是个附带的奖励吧。但是,如果您需要使用TensorFlow进行跟踪工作,请确保查看TensorBoard。

3. 理论:训练神经 络

我们将首先观察正在接受训练的神经 络。代码将在下一节中进行说明,因此您先不需要看。

我们的用神经 络训练手写数字,并对它们进行分类,即将手写数字识别为0,1,2等等,最多为9。它的模型基于内部变量(“权重”(weights)和“偏差”(biases),这两个词稍后解释),只有将这些变量训练成正确值,分类工作才能正确进行,训练方式稍后也会详细解释。现在您需要知道的是,训练循环如下所示:

 

训练数据 => 更新权重和偏差 => 更好的识别      (循环这三步)

让我们逐个浏览可视化的六个面板,看看训练神经 络需要什么。

 

该数据集中有50,000个训练数字。我们在每次迭代中将其中每100个进行训练,因此系统将在500次迭代后看到所有数字被训练了一次。我们称之为“纪元(epoch)”。

最后两个图代表了内部变量采用的所有值的范围,即随着训练的进行,权重和偏差。在这里,您可以看到,偏差最初从0开始,最终获得的值大致均匀分布在-1.5和1.5之间。如果系统不能很好地收敛,这些图可能很有用。如果你看到权重和偏差扩展到100或1000,训练可能就有问题了。

图中的方格代表是百分位数。有7个频带,所以每个频带是100/7 =所有值的14%。

Keyboard shortcuts for the visualisation GUI:
1 ……… display 1st graph only
2 ……… display 2nd graph only
3 ……… display 3rd graph only
4 ……… display 4th graph only
5 ……… display 5th graph only
6 ……… display 6th graph only
7 ……… display graphs 1 and 2
8 ……… display graphs 4 and 5
9 ……… display graphs 3 and 6
ESC or 0 .. back to displaying all graphs
SPACE ….. pause/resume
O ……… box zoom mode (then use mouse)
H ……… reset all zooms
Ctrl-S …. save current image

 

什么是“ 权重 ”和“ 偏差 ”何计算“ 交叉熵 ”练算法究竟如何工作么来看下一节内容吧。

4. 理论:1层神经 络

在这里,我们设计了一个具有10个神经元的1层神经 络,作为输出层,因为我们想将数字分为10个类(0到9),每个神经元都能分类处一个类。

对于一个分类问题,一个很好的激活函数是softmax。通过取每个元素的指数,然后归一化向量(使用任何范数,例如向量的普通欧几里德长度)来对向量应用softmax。

 

为什么“softmax”称为softmax数是急剧增长的函数。它将增加向量元素之间的差异。它也快速产生大的值。然后,当您规范化向量时,支配规范的最大元素将被归一化为接近1的值,而所有其他元素将最终除以一个较大的值,并归一化为接近零的值。清楚地显示出哪个是最大的元素,即“最大值”,但保留其价值的原始相对顺序,因此是“soft”。

我们现在将使用矩阵乘法将这个单层神经元的处理过程,用一个简单的公式表示。让我们直接用100张手写图片作为输入(如图中黑灰方块图所示,每行表示一张图片的784个像素值),产生100个预测(10个向量)作为输出。

使用加权矩阵W中的第一列加权,我们计算第一张图像的所有像素的加权和。这个和值对应于第一个神经元。使用第二列权重,我们对第二个神经元做同样的事情,直到第10个神经元。然后,我们可以重复对剩余99张图像的操作。如果我们称X为包含我们100个图像的矩阵,则在100个图像上计算的我们10个神经元的所有加权和仅仅是XW(矩阵乘法)。

每个神经元现在必须加上它的偏差(一个常数)。由于我们有10个神经元,我们有10个偏置常数。我们将这个10个值的向量称为b。必须将其添加到先前计算的矩阵的每一行。使用一些名为“广播(broadcasting)”的方法,我们用简单的加 写下来。

“ 广播(broadcasting) ”是Python和numpy的标准技巧,它是科学计算库里的内容。它扩展了正常操作对具有不兼容尺寸的矩阵的作用范围。“广播添加”是指“如果要相加两个矩阵,但是由于其尺寸不兼容,请尝试根据需要复制小尺寸以使其能相加。”

我们最后应用softmax激活函数,得到描述1层神经 络的公式,应用于100幅图像:

 

顺便说一下,什么是“ 张量(tensor) ”
  “张量(tensor)”就像一个矩阵,但是具有任意数量的维度。一维张量是向量。二维张量是矩阵。然后,您可以有3,4,5或更多维度的张量。

5. 理论:梯度下降

现在我们的神经 络产生了输入图像的预测,我们需要测量它们的好坏,即 络告诉我们与我们所知道的真相之间的距离。请记住,我们为此数据集中的所有图像的数字都有正确数字的标签。

任何距离都会有效,普通的欧几里得距离很好,但是对于分类问题,一个距离,称为“交叉熵(cross-entropy)”更有效率。

 

“ 一热(One-hot) ”编码意味着您使用10个值的矢量代表标签“6”,全部为零,但第6个值为1.这是因为格式非常类似于我们的神经 络输出预测,也作为10个值的向量。

“训练”神经 络实际上意味着使用训练图像和标签来调整权重和偏差,以便最小化交叉熵损失函数。下面是它的工作原理。

交叉熵是训练图像的权重,偏差,像素及其已知标签的函数。

如果我们相对于所有权重和所有偏差计算交叉熵的偏导数,我们获得了对于给定图像,权重和偏差的标签和现值计算的“梯度(gradient)”。记住,我们有7850个权重和偏差,所以计算梯度听起来好像有很多工作。幸运的是,TensorFlow将为我们做好准备。

梯度的数学属性是它指向“上”。由于我们想要走交叉熵低的地方,所以我们走向相反的方向。我们将权重和偏差更新一小部分梯度,并使用下一批训练图像再次执行相同的操作。希望这让我们到达交叉熵最小的坑底。

在该图中,交叉熵表示为2个权重的函数。实际上还有更多的。梯度下降算法遵循最快速下降到局部最小值的路径。训练图像也会在每次迭代中更改,以便我们收敛到适用于所有图像的局部最小值。

 

“ 学习率”:您无法在每次迭代时以渐变的整个长度更新您的权重和偏差。这就好比是一个穿着靴子的人,想去一个山谷的底部。他会从山谷的一边跳到另一边。要进入底部,他需要执行较小的步骤,即仅使用渐变的一小部分,通常在1/1000。我们将这个分数称为“学习率”。

总而言之,训练循环如下所示:

训练数据和标签 => 求损失函数=> 求梯度 (偏导数) => 最快下降 => 更新权重和偏差 => 重复下一个小批量的图像数据和标签

 

为什么要使用100个图像和标签,用这种“ 小批量 ”形式进行/p>   

您只需一个示例图像即可计算您的渐变,并立即更新权重和偏差(在文献中称为“随机梯度下降”)。这样做100个例子给出了更好地表示不同示例图像所施加的约束的渐变,因此可能更快地收敛到解决方案。小批量的尺寸是可调参数。还有另一个更技术的原因:使用大批量也意味着使用更大的矩阵,这些通常更容易在GPU上进行优化。

经常问的问题


为什么交叉熵能正确的用于分类问题/p>

6. 实验室:让我们跳入代码

已经写了1层神经 络的代码。请打开mnist_1.0_softmax.py文件并按照说明进行操作。

 

您在本节中的任务是了解此起始代码,以便以后可以改进。

您应该看到文件中的说明和代码之间只有微小的区别。它们对应于用于可视化的功能,并在注释中做了说明。你可以忽略它们。

mnist_1.0_softmax.py

首先我们定义TensorFlow变量和占位符。变量是您希望训练算法为您确定的所有参数。在我们的情况下,我们的权重和偏见。

占位符是在训练期间填充实际数据的参数,通常是训练图像。保持训练图像的张量的形状是[None,28,28,1],代表:

  • 28,28,1:我们的图像是每像素28×28像素x 1值(灰度)。彩色图像的最后一个数字将为3,这里并不需要。
  • None:此维度将是迷你批次中的图像数量。这将在训练时知道。

mnist_1.0_softmax.py

第一行是我们的1层神经 络的模型。公式是我们在以前的理论部分中建立的公式。该tf.reshape命令将我们的28×28图像转换为784像素的单个向量。重塑命令中的“-1”表示“计算机,计算出来,只有一种可能性”。实际上,这将是一个小批量的图像数量。

然后,我们需要一个附加的占位符,用于提供与培训图像一起的标签数据。

现在,我们有模型预测和正确的标签,所以我们可以计算交叉熵。tf.reduce_sum总和一个向量的所有元素。

最后两行计算正确识别的数字的百分比。留给读者使用TensorFlow API参考书,以供读者理解。你也可以跳过它们。

mnist_1.0_softmax.py

这里将是TensorFlow展示它能力的时候了。您选择一个优化器(有很多可用),并要求它最小化交叉熵损失。在此步骤中,TensorFlow计算相对于所有权重和所有偏差(梯度)的损失函数的偏导数。这是一个正式的推导,而不是一个数字化的,太费时间了。

然后使用梯度来更新权重和偏差。0.003是学习率。

最后,现在是运行训练循环的时候了。到目前为止,所有的TensorFlow指令都已经在内存中准备了一个计算图,但还没有计算出来。

 

TensorFlow的“延迟执行”模型:TensorFlow是为分布式计算构建的。在开始实际将计算任务发送到各种计算机之前,必须知道要计算的内容,即执行图。这就是为什么它有一个延迟执行模型,您首先使用TensorFlow函数在内存中创建计算图,然后开始Session执行并使用实际的计算Session.run。在这一点上,计算图不能再改变了。

   

由于该模式,TensorFlow可以接管大量的分布式计算流。例如,如果您指示在计算机1上运行一部分计算,并在计算机2上运行另一部分,则可以自动进行必要的数据传输。

计算需要将实际数据输入到您在TensorFlow代码中定义的占位符。这是以Python字典的形式提供的,其中的键值是占位符的名称。

mnist_1.0_softmax.py

在train_step当我们问到TensorFlow出最小交叉熵是这里执行获得。那就是计算梯度并更新权重和偏差的步骤。

最后,我们还需要计算一些可以显示的值,以便我们可以跟踪我们模型的性能。

在训练循环中使用该代码训练数据计算精度和交叉熵(例如每10次迭代):

通过提供测试训练数据,可以在测试数据上计算相同的数值(例如,每100次重复一次,有10,000个测试数字,因此需要一些CPU时间):

TensorFlow和NumPy的是朋友:准备计算图时,你只有操纵TensorFlow张量和如命令tf.matmul,tf.reshape等等。

然而,一旦执行Session.run命令,它返回的值就是Numpy张量,即Numpy numpy.ndarray可以使用的对象以及基于它的所有科学comptation库。这就是使用matplotlib(这是基于Numpy的标准Python绘图库)为这个实验室建立的实时可视化。

7. 实验室:添加图层

我们保持softmax作为最后一层的激活功能,因为这是最适合分类的。在中间层上,我们将使用最经典的激活函数:sigmoid:

 

您在本节中的任务是将一个或两个中间层添加到您的模型中以提高其性能。

   

解决方案可以在文件中找到mnist_2.0_five_layers_sigmoid.py。使用它,如果你不能写出来,被卡住了!

要添加图层,您需要一个额外的权重矩阵和中间层的附加偏置向量:

权重矩阵的形状是[N,M],其中N是层的输入数量和M的输出。在上面的代码中,我们在中间层中使用了200个神经元,在最后一层使用了10个神经元。

 

提示:当你深入时,重要的是用随机值初始化权重。如果没有,优化器可能会停留在初始位置。tf.truncated_normal是一个TensorFlow函数,它产生遵循-2* stddev和+ 2 * stddev之间的正态(高斯)分布的随机值。

现在将1层模型更改为2层模型:

您现在应该可以使用2个中间层(例如200和100个神经元)将精度推送到97%以上的精度。

8. 实验室:深度 络的特别照顾

Relu激活功能
在深层 络中,S形激活函数(sigmoid函数)实际上是相当有问题的。它压缩0和1之间的所有值,当您反复进行时,神经元输出及其渐变可以完全消失。改进的方法,可以使用如下所示的RELU函数(整流线性单元):

 

更新1/4:现在用RELU替换所有的S型,并且在加入图层时,您将获得更快的初始收敛,避免出现问题。只需在你的代码中简单更换tf.nn.sigmoid用tf.nn.relu。

一个更好的优化器
在这样的非常高的维度空间中,我们有10K的权重和偏差 – “鞍点”是频繁的。这些是不是局部最小值的点,但梯度仍然为零,梯度下降优化器仍然停留在那里。TensorFlow拥有一系列可用的优化器,其中包括一些可以使用一定惯量的优化器,并可以安全避开鞍点。

 

更新2/4:替换tf.train.GradientDescentOptimiser为tf.train.AdamOptimizer现在。

随机初始化

精确度仍然在0.1用随机值初始化了你的权重吗于偏差,当使用RELU时,最佳做法是将其初始化为小的正值,以使神经元最初在RELU的非零范围内运行。

 

更新3/4:现在检查所有的权重和偏差是否适当初始化。如上图所示的0.1将作为

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年6月7日
下一篇 2019年6月7日

相关推荐