转自:https://www.zhihu.com/question/41667903?sort=created
24 个回答
Google发布了Tensorflow游乐场。Tensorflow是Google今年推出的机器学习开源平台。而有了Tensorflow游乐场,我们在浏览器中就可以训练自己的神经网络,还有酷酷的图像让我们更直观地了解神经网络的工作原理。今天,就让硅谷周边带你一起去Tensorflow游乐场快乐地玩耍吧!
昨天,Google深度学习部门Google Brain的掌门人,也是Google里受万众景仰的神级别工程师Jeff Dean,在Google Plus上发布了Tensorflow游乐场的消息:
于是小伙伴们都十分激动地去Tensorflow的网站上玩神经网络了!游乐场的地址是:http://playground.tensorflow.org。让我们快点一起去看看游乐场里有哪些好玩的东东吧。
一打开网站,就看见上面的标语:
“在你的浏览器中就可以玩神经网络!不用担心,怎么玩也玩不坏哦!”
这简直太令人振奋了!面对这么多可以随便点的按钮,咱们从哪儿开始呢?
首先让我们来看看数据。在这个游乐场中,我们有4种不同形态的数据可以玩:
每组数据,都是不同形态分布的一群点。每一个点,都与生俱来了2个特征:x1和x2,表示点的位置。而我们数据中的点有2类:橙色和蓝色。我们的神经网络的目标,就是通过训练,知道哪些位置的点是橙色、哪些位置的点是蓝色。
如果橙色是橙子,蓝色是蓝莓。假设我们有2000个散落在各处的橙子和蓝莓。前1000个,我们知道坐标(1,1)的是蓝莓,(2,2)的是橙子,(0.5,0.5)的是蓝莓等等。我们要用这些信息来训练我们的神经网络,让它能够准确地预测出后1000个哪些是橙子、哪些是蓝莓。
看上面的4组数据,我们会发现,前3中都能相对简单地区分开,而最后一组螺旋数据会是最难的。
Tensorflow游乐场中的数据十分灵活。我们可以调整noise(干扰)的大小,还可以改变训练数据和测试数据的比例多少。下图是不同noise的数据分布。
当我们把每一个数据点的信息喂给机器学习系统时,我们需要做feature extraction,也就是特征提取。如果我们真的是在区分蓝莓和橙子的话,大小、颜色等等都会是我们的特征。而这里,每一个点都有x1和x2两个特征。除此之外,由这两个特征还可以衍生出许多其他特征:
抽象来说,我们的机器学习classifier(分类器)其实是在试图画一条或多条线。如果我们能够100%正确地区分蓝色和橙色的点,蓝色的点会在线的一边,橙色的会在另一边。
上面这些图其实非常的直观。第一张图中,如果x1作为我们的唯一特征,我们其实就是在画一条和x1轴垂直的线。当我们改变参数时,其实就是在将这条线左右移动。其他的特征也是如此。
很容易可以看出,我们需要智能地结合这其中一种或多种的特征,才能够成功地将蓝色点和橙色点分类。这样的feature extraction,其实往往是机器学习应用中最难的部分。好在我们有神经网络,它能够帮我们完成大部分的任务。
如果我们选定x1和x2作为特征,我们神经网络的每一层的每个神经元,都会将它们进行组合,来算出结果:
而下一层神经网络的神经元,会把这一层的输出再进行组合。组合时,根据上一次预测的准确性,我们会通过back propogation给每个组合不同的weights(比重)。这里的线越粗,就表示比重越大:
下面就让我们用最难的螺旋形数据,来试试这个神经网络的表现吧!
在神经网络出现前,我们往往会竭尽所能地想出尽可能好的特征,把它们全都喂给系统。而系统会是个十分浅的系统,往往只有一层。用这样的方法来完成分类。
让我们先来实验传统的方法。在这里,我们将所有能够想到的7个特征都输入系统,并选择只有1层的神经网络:
最后的结果是这样的,可以看出我们的单层神经系统几乎完美地分离出了橙色点和蓝色点:
接下来,让我们来体验神经网络真正的魔法。神经网络最大的魔力,就在于我们根本不需要想出各种各样的特征,用来输入给机器学习的系统。我们只需要输入最基本的特征x1, x2, 只要给予足够多层的神经网络和神经元,神经网络会自己组合出最有用的特征。
在这次试验中,我们只输入x1, x2,而选择1个6层的,每层有8个神经元的神经网络:
最后的结果是这样的。我们发现,通过增加神经元和神经网络的层数,即使没有输入许多特征,我们也能够成功地分类:
神经网络的伟大之处就在于此。当我们在解决分类橙色点和蓝色点这样的简单问题时,想出额外的特征似乎并不是难事。但是,当我们要处理的问题越来越复杂,想出有用的特征就变成了最最困难的事。比如说,当我们需要识别出哪张图片是猫,哪张图片是狗时,哪些特征是真正有效的呢?
而当我们有了神经网络,我们的系统自己就能学习到哪些特征是有效的、哪些是无效的,这就大大提高了我们解决复杂机器学习问题的能力,简直是太酷啦!
看了以上的文章,你是不是对神经网络有了更直观的认识呢?好奇的小伙伴们,欢迎去http://playground.tensorflow.org/自己试试看,真的非常好玩!
线上分享|深度学习TensorFlow下的计算机视觉 - 知乎专栏
GitHub - wagamamaz/tensorflow-tutorial: Collection of TensorFlow tutorials
作为TensorFlow社区的contributor (41/415),我来说说我的TensorFlow学习过程。
目前TensorFlow代码已超过40w行,从代码量上来看,绝不是一个能够迅速上手的小项目。所以,想要精通TensorFlow的同学需要做好心理准备。
http://cloc.sourceforge.net v 1.64 T=45.33 s (68.5 files/s, 14956.6 lines/s)
--------------------------------------------------------------------------------
Language files blank comment code
--------------------------------------------------------------------------------
C++ 1084 33620 28397 185395
Python 988 43498 72410 160669
C/C++ Header 605 13609 23891 45446
HTML 100 1803 1572 24929
TypeScript 75 1836 4795 11681
Bourne Shell 60 1174 2147 4346
NAnt script 15 172 0 3328
CMake 28 298 495 1778
Protocol Buffers 43 555 1928 1337
Objective C++ 9 217 168 1186
Java 9 239 408 943
JSON 46 0 0 626
Go 9 93 244 544
make 3 96 112 542
Bourne Again Shell 4 52 91 310
Javascript 7 50 109 191
XML 18 97 205 149
Groovy 1 13 7 52
Objective C 1 10 13 21
CSS 1 4 11 6
--------------------------------------------------------------------------------
SUM: 3106 97436 137003 443479
--------------------------------------------------------------------------------
对于想要学习TensorFlow(以下简称TF)的人,根据目的不同,可以简单分为以下2类:
1. 研究学者,仅仅需要TF这个平台实现深度学习算法,无需了解太多底层原理
2. 好学的行业内人员(比如我⊙﹏⊙),不仅需要了解算法模型,同时还要熟悉TF平台的原理。在算子、通信、模型优化等方面进行平台的二次开发的人。
研究学者:
你们可以考虑使用Keras,python写的深度神经网络库,已经实现了绝大部分神经网络,如:RNN、GRU、LSTM,CNN,Pooling,Full-Connected,以及sigmoid、tanh、Relu、PRelu、SRelu等各种激活函数。并且采用TF/Theano作为后端计算引擎,自己本身拥有一套更高层的API,可以同时跑在TF/Theano平台上。
相对于TF来说,这个学习压力小了很多,我们公司负责算法的同事也是用Keras来写模型,然后我再用TF的API来实现分布式部署。
附:
Keras中文文档
GitHub - fchollet/keras: Deep Learning library for Python. Convnets, recurrent neural networks, and more. Runs on Theano or TensorFlow.
开发人员:
对于我们这类人来说,首先需要弄清平台的很多名称、概念、定义, @贾扬清 曾说过TF有太多的Abstraction需要学习。诚然,这加大了我们的学习难度。但是,这也说明Google是想要把这个平台做大做强的,所以才会花时间去设计这一套框架和统一的结构。特别是读了部分源码后,更有这种感触。
那么,具体要怎么开始呢?
极客学院有翻译部分TF的官方文档,对于初步了解Tensor、DAG、Operator、Variable、Device、Optimizer等是帮助的。在看完这些概念后,有一个MNIST的例子程序作为TF的入门。这个样例用一个简单的Softmax实现了手写体数字识别的神经网络,只有一层参数。同时还介绍了Session、tf.placeholder、图的计算等重要概念。
在看完这个样例后,如果理解了DAG和Session,可以继续看用卷积神经网络实现的MNIST,准确率上升到了99%,相对于单层Softmax的92%左右,已经接近目前最高的准确率了。
附:
MNIST机器学习入门
深入MNIST - TensorFlow 官方文档中文版
TF v0.8发布了分布式模型,我也研究了将近1个月,才把Seq2seq机器翻译改造成了分布式,但是现在公司不让发布出来ORZ。好消息是,我改写了社区的MNIST分布式程序,并且已经合并到master分支了。所以,如果想要继续学习分布式的话,我建议可以看一下那份代码。比较遗憾的是,极客学院目前没有翻译分布式的教程,所以大家得移步TF官网(貌似被墙了)。
由于分布式的资料较少,我这里简单梳理下概念,大家在官网会看到他们的定义:
TF采用了PS/Worker的结构来定义集群,其中
PS(parameter server):存储variable(模型参数),主要负责参数更新和发放;
Worker:存储operator,主要负责图计算和梯度计算(TF使用Optimizer实现了自动化的梯度计算);
job:由于工作类型不同,用job_name来区分ps和worker
task:对于每个worker来说,具体做什么任务(算什么图)也有可能不同,用task_index区分
device:指具体的CPU/GPU,通常PS绑定到CPU上,Worker绑定到GPU上,各取所长。
syncReplicaOptimizer:同步优化器,其本质仍然是用普通优化器进行梯度计算,但是通过Queue机制和Coordinator多线程协同实现了所有worker的梯度汇总和平均,最终将梯度传回PS进行参数更新。
以上几个概念对于分布式的理解非常重要。当然,想要完全弄懂,还得不断的看文档和源码。
源码我推荐几个python目录下非常值得看的基础类定义:
framework/Ops.py:定义了Tensor、Graph、Opreator类等
Ops/Variables.py:定义了Variable类
附:
分布式官网教程
分布式MNIST
tensorflow/ops.py at master · tensorflow/tensorflow · GitHub
tensorflow/variables.py at master · tensorflow/tensorflow · GitHub
最后,欢迎大家Follow我的Github账号:
DjangoPeng (Jingtian Peng) · GitHub
个人感觉学习编程最好的方式就是: 上来就是干。Talk is cheap, show me the code !
内容包括:
1. Tensorflow 的基本结构, 用法;
2. 多层神经网络 (回归 & 分类);
3. CNN 卷积神经网络;
4. RNN 循环神经网络;
5. LSTM 高级循环神经网络;
6. Autoencoder 神经网络的非监督学习;
7. 可视化助手 Tensorboard (查看学习结果, 参数变化, 神经网络结构) 等等.
教程还附加了所需要的代码, 可以用于练习, 是新手快速上路必看的教程. 有了视频里生动的形容, 比文字叙述上手快多了. 听说很多人都是一晚上通宵看完的~ 大家一起加油吧!
系列教程视频 Youtube 接口: https://www.youtube.com/playlist?list=PLXO45tsB95cKI5AIlf5TxxFPzb-0zeVZ8
优酷接口: 莫烦 tensorflow 神经网络 教程
刚制作了 Tensorflow 视频教程对应的学习目录: 莫烦 Python 视频和辅助材料都很好的对应上了.
频道还会一直有新的关于机器学习的内容不定时更新.
博客里有一些相关链接, 是个人读paper和学习tensorflow的时候做的笔记:
TensoFlow之深入理解GoogLeNet TensorFlow之深入理解AlexNet TensorFlow之深入理解Neural Style TensorFlow入门一
新手向的Tensorflow学习之路(Learning paths)
文中的教程或者blog以及论文书籍基本上都是经典,推荐入门学习。
贴在这里:
在学习Tensorflow的过程中磕磕碰碰,总结一些个人心得记录于此,志同道合之友共勉~~
1.稳定的网络:Tensorflow毕竟出自Google,官方文档访问不是很稳定。而且一般来说,对于英文的文档,资料和疑问,Google搜索的结果要比Baidu好很多。(不是偏见,是各有所长,天气地图电影啥的,百度还是做的很好的)
2.Github:这是个开源程序的网站,Linux内核就在这个网站托管。Github的核心是Git,一种版本控制系统,已经逐渐取代SVN。这个网站托管了很多高质量的或者说世界顶尖的开源项目,比如Tensorflow。学习一下这个网站如何使用,注册个账号,学习一下Git的使用方法。这个网站有自己的tutorial和guide。
3.Linux: Tensorflow的主要运行平台就是Linux,目前在Windows上运行的方案是虚拟机,但是深度学习对计算要求还是比较高的,虚拟机效率不是太高,因此还是推荐在原生Linux中运行。新手推荐发行版是Ubuntu 或者Linux mint。这个可以自行搜索。学习Linux也有很多好处,因为很多开源软件都only linux的。
4.Python:这是一种非常流行的脚本语言,庞大的第三方库可以快速写出短小容易理解的代码,而且也是Tensorflow的推荐开发语言。教程太多了,这里给几个优秀的教程:官网教程,Learn Python the Hard Way,Python2.7教程
5.深度学习(Deep Learning,DL):虽然Tensorflow已经封装好了大部分DL的细节,但是如果不了解DL的相关核心概念,就会很难着手分析问题。首先强烈推荐这个教程,通读一遍,然后还有这个,可以快速浏览或者只看自己不太明白的地方,还有这个分块介绍的,还有几篇blog,这个和这个讲的是卷积神经网络。图像识别用的比较多的就是卷积神经网络,这两篇可以看看。
6.Tensorflow:前面都是铺垫,是为了更好地使用Tensorflow。官方的文档不错,可以从get started然后tutorial看起,有个中文的翻译版,但是更新不及时(官方已经v0.11,这个可能是v0.8或者v0.7),可能有坑,可以和英文对照着看,还有个Tensorflow的教程,也不错。有篇FIRST CONTACT WITH TENSORFLOW也不错。
7.优秀博客:Hackery, Math & Design,Mike Bostock,http://colah.github.io/,Welcome! | Irene's Blog on WordPress.com,这几个都是我在学习中遇到的非常nice的blog,有时间读读定会有所收获。
8.经典论文及书籍:收集了一些DL的经典论文&书籍,有些杂乱,不过几乎都是经典,各取所需吧。百度云地址(密码: 4w91)。各位有更好的欢迎推荐,我会整理上传。
9.几篇原创TF相关文章(持续更新):如何理解TensorFlow中的batch和minibatch,结合TensorFlow PlayGround的简单神经网络原理解释
其中,Python,DL,Tensorflow是重点,其他都是辅助, 自己感觉够用即可,无需深入。学习中遇到困难首先向搜索引擎询问。
2016.10.15 更新:更新了提及的软件版本号,添加了第九部分原创TF相关博文
2016.8.8 更新:更新了提及的软件版本号
2016.7.27 更新:重新排版,上传了资料
2016.7.6 更新:重新排版
- TensorFlow: Large-scale machine learning on heterogeneous systems
- First Contact With TensorFlow
- tensorflow.org 的页面
- GitHub - tensorflow/tensorflow: Computation using data flow graphs for scalable machine learning
- GitHub - aymericdamien/TensorFlow-Examples: TensorFlow tutorials and code examples for beginners
本文写给机器学习和tensorflow的初学者。如果你已经知道mnist,softmax(multinomial logistic)regression,你可以会想看这个faster paced tutorial.不过,首先得确认你已经 install TensorFlow .
初学编程,一般都会学习写一个“hello world!”的程序,MNIST就相当于机器学习领域的“hello world!”
MNIST是一个机器图像数据集。它包含像下面的一些手写的数据图像:
它还包括了每个图像的数字标签。例如,上面的图片的标签是 5、0、 4 和 1。
在本教程中,我们要训练一个模型来识别图像并预测他们是什么数字。我们的目标不是训练一个真的精准的模型,达到极强的性能 — — 虽然我们以后会给你代码来做到 !— — 而是要以之为引字让大家初步了解如何使用TensorFlow。因此,我们要开始与一个非常简单的模型,称为 Softmax 回归。
在本教程中的实际代码是非常短的和所有有趣的事情发生只需要三行代码。然而,了解其背后的理念很重要 ︰ TensorFlow 的工作原理和核心机器学习的概念。正因为如此,我们要非常认真地学习这些代码。
The MNIST DataMNIST 数据Yann LeCun's website网站上。为了方便,我们已经包括一些 python 代码来自动下载并安装数据。你可以要么下载的代码和将其导入如下,或简单地复制并粘贴它。
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
正如前面提到的每个 MNIST 数据点有两个部分 ︰ 图像的手写的数字和相应的标签。我们将调用图像"xs"和标签"ys"。训练集和测试集包含 x 和 y 们,例如训练图像是 mnist.train.images 训练的标签是 mnist.train.labels。
每个图像是 28 x 28 像素。我们可以把这解读为一大系列的数字 ︰
我们可以把这些数据变成一个 28 × 28 = 784 矢量数组。我们如何拼合数组并不重要,只要所有的图像都一致。从这个角度来看,MNIST 图像都只是一堆784三维向量空间,有很丰富结构 (警告 ︰ 计算密集型的可视化效果)。
扁平数据扔掉图像的二维结构有关的信息。不会很糟糕吗?嗯,最好的计算机视觉方法会利用这种结构,我们将在以后的教程中提到。我们在这里用到的简单方法,使用 softmax 回归,则不会关注这些结构。
其结果是,mnist.train.images 是一个形状 [55000,784]的张量(n 维数组)。第一维是图像和第二个维度是每个图像的像素。在张量的每个条目是 0 和 1 之间,为某个特定的图像中像素点的像素强度。
MNIST 中的相应标签是数字 0 至 9,描述给定的图像是哪个数字。出于本教程的目的,我们要想我们作为一个"one-hot"的标签。one-hot矢量是一个由多个0和一个1组成的向量。在这种情况下,第 n 个数字将被表示为一个向量中第 n 个元素为1。例如,3 将是[0,0,0,1,0,0,0,0,0,0]。这样,mnist.train.labels 是 [55000,10]阵列的浮点数。
现在我们就可以真正开始建立我们的模型了!
Softmax Regressions我们知道,在 MNIST 中的每个图像是一个数字,无论是零或九。我们想要能够通过一张图片,给它是每个数字的概率。例如,我们的模型可能看到了九的图片并给出 80%的概率它是一个九,但给出它可以是5%是八的可能性 (因为顶层循环) 和极小的概率它可能是所有其他数字。
这是一个经典的案例,其中 softmax 回归是一个自然、 简单的模型。如果你想要将概率分配给一个或者几个不同的可能时,softmax 就可以完成这样的事情。甚至后来,当我们训练更复杂的模型,最后一步也将是softmax一层。
Softmax 回归有两个步骤 ︰ 首先我们要把这些输入的特征加起来,然后我们将这些特征转换成概率。
为了总结了给定的图像的特征,我们把这些像素强度做加权求和。权重的大小表明该特征在确定它为正确分类时候的作用大小。
下面的关系图显示了学到的每个类的权重一个模型。红色代表负的权重,而蓝色表示正的权重。
We also add some extra evidence called a bias. Basically, we want to be able to say that some things are more likely independent of the input. The result is that the evidence for a class i given an input x is:
我们还添加了一些额外的证据,被称为一种偏见。基本上,就指独立于输入的特征。结果是对于i这一类据,我给出了输入 x,结果就是︰
evidencei=∑jWi, jxj+bi
其中Wi是权重,bi是类i的偏见,,j是输入x像素。我们可以通过softmax函数把这些变成预测的概率如下:
y=softmax(evidence)
这里 softmax 担任"激活"或"链接"的功能,把我们的线性函数输出变成我们想要的结果 — — 在这种情况下,概率分布为 10 例。你可以认为它是把输入的证据转换成可能是某一类的可能性。它被定义为 ︰
softmax(x)=normalize(exp(x))
展开方程你会得到如下的公式:
softmax(x)i=exp(xi)/∑jexp(xj)
通常以第一种方式看 softmax︰指数化输入,然后正则化输出。指数化意味着更多的输入特征会指数级增加其权重。相反,较少单元特征会让假设中获得其权重的一小部分。假设分类不会有0或者负的权重。Softmax然后正则化这些权重,以便他们相加为一,形成一个有效的概率分布。(若要了解更多关于softmax 函数的内容,参见 section 它迈克尔 · 尼尔森书,完整的交互式可视化中一节)。
你能想象 softmax 回归作为类似下面的内容,虽然现实中会有更多的 xs。对于每个输出,我们计算 xs 的加权的和,添加一个bias,然后应用 softmax。
如果把它写成方程,就可以得到 :
然后我们可以把这个过程“标量化”,变成矩阵相乘和向量相加。这会让计算更加快速。(也是一种简化思考的方法)
更加简化一下,我们可以把它写成:
y=softmax(Wx+b)
进行回归
要在Python中做到快速数值计算,我们通常使用像 NumPy 做矩阵乘法,然后使用python之外的另一种语言实现的高效代码的库。不幸的是和Pyhton操作的切换间仍有很大的开销。这种开销是尤其糟糕,如果你想要在 Gpu 上或以分布式的方式运行。这种方法下数据传输的成本会比较高。
TensorFlow 也是在 python之外做这些繁重的计算,但它更进一步,从而避免这种开销。不是用python以外的语言独立运行单个昂贵的操作,TensorFlow让我们通过图描述的方式完全从外部运行python的交互操作。(可以在几个机器学习库中看到像这样的方法)。
若要使用 TensorFlow,我们需要将其导入。
import tensorflow as tf
这些交互式的操作需要符号变量。我们先来创建一个:
x = tf.placeholder(tf.float32, [None, 784])
x并不是一个特定的值,它是一个placeholder,一个我们需要输入数值当我们需要tensorflow进行运算时。我们想要输入任意数量的mnist图片,每一个都展开成一个784维的向量。我们用一个二维的[None, 784]浮点张量代表。 (这里的None表示维度可以是任意的长度.)
我们的模型中也需要权重和bias。我们可以把它们看成是额外的输入,Tensorflow有更加好的方法来表示它: Variable. Variable是一个Tensorflow图交互操作中一个可以修改的张量。 它可以在计算中修改。对于机器学习的,一般都有一些Variable模型参数。
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
注意,W 的形状 [784,10] ,是因为我们想要 784 三维图像向量乘以它输出10 维向量以标识的不同类。b形状是 [10],这样我们可以将其和输出相加。
现在,我们可以实现我们的模型。它只需要一行代码 !
y = tf.nn.softmax(tf.matmul(x, W) + b)
就是这样。我们只花了一行代码来定义我们的模型。不是因为 TensorFlow 旨在简化 softmax 回归︰ 它只是想通过非常灵活的方式来描述很多各种各样的数值计算,从机器学习模型到物理模拟。定义后,可以在不同的设备上运行我们的模型︰您的计算机的CPU、Gpu、甚至手机 !
训练
为了训练我们的模型,我们需要定义怎么样的模型才是好的。嗯,实际上,在机器学习中我们通常会为模型定义怎么样是坏的称为成本或损失,然后再试,尽量最小化这个成本或者损失。但两者是等同的。
一个很常见的很好的成本函数是"cross-entropy交叉熵"。出人意料的是,交叉熵虽然产生于对信息压缩码信息理论的思考,但它最终被在很多方面,从赌博到机器学习。它的定义是︰
Hy′(y)=−∑iyi′log(yi)
这里y是我们预测的概率分布,而y′ 是真正的分布(那个我们要输入的one-hot标题).某种理解下,交叉熵可以衡量我们的预测是多少的低效。本文不会更加详细地深入交叉熵,但它很值得去理解-> understanding.
为了使用交叉熵,我们要先增加一个新的placeholder来放正确的结果:
y_ = tf.placeholder(tf.float32, [None, 10])
然后设置交叉熵, −∑y′log(y):
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
现在,我们知道我们想要我们的模型做什么,它是很容易通过 TensorFlow 去训练它。因为TensorFlow 了解整个图的计算,它可以自动使用反向传播算法有效地确定你的变量是如何影响成本函数并把它最小化。然后,它可以应用您所选择的优化算法来修改变量和降低成本函数。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
TensorFlow 实际上做什么在这里,在幕后,是它向你执行反向传播和梯度下降的图表添加新操作。然后它给你回到单个操作,当运行时,会做一步的梯度下降法训练,微调一下您的变量,以降低成本。
现在,我们设置好了我们的模型。最后一件事在我们启动它之前,我们要添加一个操作来初始化我们创建的变量︰
init = tf.initialize_all_variables()
现在我们可以启动一个会话,然后运行初始化变量的操作:
sess = tf.Session()
sess.run(init)
训练走起来-- 我们要进行1000次这样的训练!
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
Each step of the loop, we get a "batch" of one hundred random data points from our training set. We runtrain_step feeding in the batches data to replace the placeholders.
Using small batches of random data is called stochastic training -- in this case, stochastic gradient descent. Ideally, we'd like to use all our data for every step of training because that would give us a better sense of what we should be doing, but that's expensive. So, instead, we use a different subset every time. Doing this is cheap and has much of the same benefit.
在循环的每一步,我们从我们的训练集得到一百随机数据点"批处理"。我们运行 train_step 批次的数据来替换占位符。
使用随机数据进行小批量称为随机训练 — — 在这种情况下,随机的梯度下降法。理想情况下,我们想使用我们所有的数据训练的每一步,因为这会给我们感觉是更好的方法,但这样代价太大。相反,每次我们使用一个不同的子集,这样做代价更小而且可以达到相同的效果。
模型评价How well does our model do?
Well, first let's figure out where we predicted the correct label. tf.argmax is an extremely useful function which gives you the index of the highest entry in a tensor along some axis. For example, tf.argmax(y,1) is the label our model thinks is most likely for each input, while tf.argmax(y_,1) is the correct label. We can use tf.equalto check if our prediction matches the truth.
我们的模型表现如何呢?
好吧,先让我们弄清楚我们预测正确的标签在哪里。tf.argmax 是项的极其有益的函数,它给返回在一个标题里最大值的索引。例如,tf.argmax(y,1) 是我们的模型输出的认为是最有可能是的那个值,而 tf.argmax(y_,1) 是正确的标签的标签。如果我们的预测与匹配真正的值,我们可以使用 tf.equal来检查。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
这会返回我们一个布尔值的列表.为了确定哪些部分是正确的,我们要把它转换成浮点值,然后再示均值。 比如, [True, False, True, True] 会转换成 [1,0,1,1] ,从而它的准确率就是0.75.
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
最后我们在测试数据上求准确率的值:
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
应该会是大约 92%.
这样的结果是不是已经很好了呢?好吧,并不是真的。事实上,它糟糕透了。这是因为我们使用的一个非常简单的模型。一些小的变化,我们实事上可以达到 97%的准确率。最好的模型可以到达 99.7%以上精度 !(有关详细信息,看一看这结果列表-> list of results)。
然而重要的是我们学会了使用这个模型。不过,如果你对于这个结果还是不太满意,查阅the next tutorial我们通过一个教程和学习如何通过TensorFlow构建更复杂的模型,它会达到更高的精度哦!
欢迎访问网站:奇趣儿 – 到天边外去…
欢迎关注微信号:奇趣儿beta
欢迎扫描二维码:
- 看Paper,了解TensorFlow核心概念
- 看官方文档,了解Usage
- 参照文档写Demo
- 使用TensorBoard加深印象
- 搭建分布式TensorFlow
- 学习深度学习算法
- 写更多的Demo
- 学更多的深度学习算法
- 写更多的Demo
- 参与TensorFlow社区讨论
- 看TensorFlow源码
入门最佳拿好不谢
### 2016.11.10 update ###
由于一直做的是文本,基于图像数据的项目都没怎么仔细看过,昨天完整读了官方[cifar10]( tensorflow/tensorflow/models/image/cifar10 at master · tensorflow/tensorflow · GitHub)整个项目的代码,惊觉这不就是完美的tensorflow项目架构吗!
因此,对于已经看过一定tf代码的童鞋,一定要看官方cifar10的整个项目逻辑。醍醐灌顶,非常有帮助。
至于为什么是先看过一定代码,原因是只有看了很多项目组织代码的烂方式后,才能发现这其中的精妙所在呀!
我补充一个连接: https://www.udacity.com/course/viewer#!/c-ud730/l-6370362152/m-6379811815 这个是Udacity 谷歌给的deep learning 课程,代码就在tensorflow源码里面。几个作业很有趣。课程画风很可爱,主要是跟着官方Tensorflow的习惯来的,讲解理论的时候会比较照顾得到,比如CNN部分的padding什么的命名都是严格按照TF方法里的标准。
不过建议大家不要把这门课用来入门上手,理论部分讲解的可能不适合入门级。作业代码可能也需要花点时间去理解。
我也放个blog地址,初学者欢迎大家交流评论: Welcome! | Irene's Blog on WordPress.com
-----再次更新-----
听说大天朝对tf的官网有限制,所以这里有一个中文网站 TensorFlow中文社区
不过鉴于TF官方一直在更新,中文翻译可能相对落后。有跟去年就开始使用tf的朋友聊过,他说现在看官方的代码和以前他学习的时候有点不一样了。所以还是尽量多去官网看。
另外,在学习官方tutorial的时候,有些方法在API里没有找到,师兄的建议是要去源码里看。比如LSTM那里,所有的gate都隐藏在cell方法里,要找到进去看才会理解吧。为此,我从Jupyter Notebook特意换上PyCharm,因为这样比较容易trace。
官方tutorial也是。。。醉人。。。我猜每个section都是不同的人写的,思路也有点不一样。。。。。
有新方法再更,就酱。