前言
上月导师在组会上交我们用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这个词应该翻译成什么?
1. 概述
在这个codelab中,您将学习如何创建和训练识别手写数字的神经网络。一路上,随着你增强神经网络的准确率达到99%,你还将学习到专业人员用来训练模型的高效工具。
该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的信息库,克隆源代码(也可以直接登入这个网址,直接下载)
git clone https://github.com/martin-gorner/tensorflow-mnist-tutorial
- 1
- 1
下载的文件夹中含多个文件。首先是让mnist_1.0_softmax.py运行起来。其他很多文件是用于加载数据和可视化结果的解决方案或支持代码。
当您启动初始python脚本时,您应该看到一个实时可视化的培训过程:
python3 mnist_1.0_softmax.py
- 1
- 1
如果python3 mnist_1.0_softmax.py不起作用,用python命令:
python mnist_1.0_softmax.py
- 1
- 1
疑难解答:如果无法使实时可视化运行,或者您只希望仅使用文本输出,则可以通过注释掉一行并取消注释另一行来取消激活可视化。请参阅下载文件的底部的说明。
为TensorFlow构建的可视化工具是TensorBoard。其功能比我们本次教程中所需要的更多。它可以在远程服务器上跟踪您的分布式TensorFlow作业。对于我们在这个实验中我们只需要matplotlib的结果,能看到训练过程的实时动画,就当是个附带的奖励吧。但是,如果您需要使用TensorFlow进行跟踪工作,请确保查看TensorBoard。
3. 理论:训练神经网络
我们将首先观察正在接受训练的神经网络。代码将在下一节中进行说明,因此您先不需要看。
我们的用神经网络训练手写数字,并对它们进行分类,即将手写数字识别为0,1,2等等,最多为9。它的模型基于内部变量(“权重”(weights)和“偏差”(biases),这两个词稍后解释),只有将这些变量训练成正确值,分类工作才能正确进行,训练方式稍后也会详细解释。现在您需要知道的是,训练循环如下所示:
训练数据 => 更新权重和偏差 => 更好的识别 (循环这三步)
让我们逐个浏览可视化的六个面板,看看训练神经网络需要什么。
在这里,您可以看到100个训练数字被送入训练循环,注意是一次100个数字,这图显示的是这100个手写数据被训练的结果。在目前的训练状态下,神经网络已经能识别(包括白色背景和部分数字),当然也有些是识别错误的(图中红色背景的是计算机识别错误的手写数字,左侧小打印的数字是该书写字的正确标签,右侧小打印的数字是计算机标识别的错误标签)。
该数据集中有50,000个训练数字。我们在每次迭代中将其中每100个进行训练,因此系统将在500次迭代后看到所有数字被训练了一次。我们称之为“纪元(epoch)”。
为了测试训练好后模型的识别质量,我们必须使用系统在训练期间没有用到过的手写数字。否则,模型可能会识别所有已训练的数字,但仍然不能识别我刚才新写的数字“8”。MNIST数据集中包含10,000个测试手写数字。在这图里,您可以看到大约1000个数字,其中所有被识别错误的,都放在顶部(红色背景上)。图左侧的比例可以大致表示分类器的准确性。
为了开展训练,我们将定义一个损失函数,即代表系统识别数字的程度值,并尝试将其最小化。损失函数的选择(这里是“交叉熵(cross-entropy)”)将在后面解释。您在这里看到的是,随着训练的进展,训练和测试数据的损失都会下降:这是好的。这意味着神经网络正在学习。X轴表示通过学习循环的迭代次数。
准确性只是正确识别的数字的百分比。这是在训练和测试集上计算的。如果训练顺利,你会看到它上升。
最后两个图代表了内部变量采用的所有值的范围,即随着训练的进行,权重和偏差。在这里,您可以看到,偏差最初从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层神经网络
MNIST数据集中的手写数字是28x28像素的灰度图像。对于它们进行分类的最简单方法是使用28x28 = 784像素作为第1层神经网络的输入。
神经网络中的每个“神经元”都会对其所有输入进行加权和,增加一个称为“偏差”的常量,然后通过一些非线性激活函数来提取结果。
在这里,我们设计了一个具有10个神经元的1层神经网络,作为输出层,因为我们想将数字分为10个类(0到9),每个神经元都能分类处一个类。
对于一个分类问题,一个很好的激活函数是softmax。通过取每个元素的指数,然后归一化向量(使用任何范数,例如向量的普通欧几里德长度)来对向量应用softmax。