python使用tensorflow_使用 TensorFlow 和 Python 进行深度学习(附视频中字)

接下来我们来讲TensorFlow。TensorFlow是谷歌研发的库,用于构建这类机器学习模型。TensorFlow是开源的库,使用Python。同时是用来构建神经网络的通用机器学习库。去年11月我们对它进行了开源。现在已经被用于许多机器学习项目。

TensorFlow的名字源于我之前提过的,即让张量(tensor)在管道中流动(flow)。从而有张量的数据流通过神经网络。这个思路来自于为这些张量绘制的流程图。它有一些很酷的特征,比如说能够灵活直观地构建图像框架,支持线程、队列和异步运算。可以在CPU GPU或任何支持TensorFlow的设备上运行。它会在图中进行操作 并对其进行分解,分配到许多的CPU和GPU上。

TensorFlow的核心数据结构在于图(graph)。操作就是图中的节点,值的张量在操作间传递。包括其他内容比如常量(constants)即在训练时不改变的量。这些可以在训练时或者更新模型时改变,但在单次训练中是不会改变的。还有占位符(placeholders)和变量(variables)。占位符类似于神经网络中的输入,而变量则是在训练神经网络时不断更新的。一般来说,有作为神经网络输入的占位符,以及变量类似在训练中进行更新的权重或者偏差。会话(session)则用于封装运行所在的环境,它的作用类似于把操作映射到设备上。这张幻灯片是非排他性列表,包括TensorFlow所支持的操作。我们有一些TensorFlow中所支持的操作。

这是在Jupiter notebook上运行TensorFlow的例子。我将用非常基础的MNIST例子进行讲解,MNIST是用于机器学习的经典数据集,包括许多手写数字的图片。你要做的就是,用这些数字进行光学字符识别(OCR)或者字符识别,从而确定每个图片代表什么数字。

如果是1,那么你希望输出文本是1。现在我要加载测试数据,在训练数据集中进行测试。训练图片共有55000张,每张图片都被表述或映射到张量中,大小为784个维度,每一张图片都有784个像素,即28乘28。

我调出一张图,这是训练数据集中的第6张图。实际输出是这样。这是数字8的图片,如果看到原始的输入图像,输入图像中的值都代表图像中的一个特定像素。从0到1,代表这个图像多暗。如果是0,像素则为白色。如果是1或者接近1,像素则比较暗。

然后看到这里,这些是训练数据。这是训练数据输出的形状。是10维的,大小为10的数组。输出为0、1。训练数据是0或1,或是任何一个值。这说明了训练数据代表什么。这是输入图像的实际训练标签,这里为8。在第8个位置有个1,说明这个图片为8。我们将用它训练神经网络。

这是我之前展示的图片。就像你训练神经网络一样会看到每个像素,并为特定像素分配一个权重。因为我将会做一个相当浅的神经网络,只有一个隐藏层。这会要给每个像素分配权重,表示这个像素或者图片是否代表特定数字。这里的蓝色表示正权重值(positive weight),红色表示负权重值(negative weight)。所以蓝色区域的像素表示为0。1、2也是同理。具体看到这个,这个类似实际数字的权重。你可以看到,这里的8看起来很像8。

一旦完成这一步,你可以设置神经网络。要如何实际训练它。这实际定义神经网络。我创建了X作为占位符,这是神经网络的输入。所以X是输入,形状为784维度。这意味着大小不一定为55000,它可以是任意大小。接着分配这些变量,因此权重和偏差将在训练中更新。

然后我要定义在值上进行的操作。这里要进行矩阵乘法,这是我要进行的预定义操作之一。用X乘以W 并且乘以所有的权重,即进行这个矩阵乘法。最后加上B,加上偏差。接着在上面运行softmax。这能够让我在神经网络中进行训练。

现在要定义训练步骤,这定义了我将在神经网络上进行的反向传播。在这里我定义一个占位符,这是为了损失函数。在这个例子中我将用到交叉熵(cross-entropy)。这是损失函数的一种,你可以尝试其他几个。但这是一个非常简单的例子。

我将使用梯度下降优化器,这是用来更新权重和偏差的方法。当出现差异时你可以使用梯度下降,从而明确该如何更新权重和偏见,应该更新多少。你将使用这个优化器,尝试找出输出的差异,然后映射到需要更新的权重和偏差的差异上。这将告诉我如何将交叉熵函数最小化,进行可视化后是这样。有初始值,接着使用梯度下降优化器。从而明确该如何改变这些值,以获得更好的输出。为了得到更好的值需要反复重复该过程。这里存在找到本地最小值的问题,这是调整值的不错方式。

接下来我将在神经网络中,使用优化器或者反向传播从而进行训练。这将对会话进行初始化,即对TensorFlow的训练会话进行初始化。然后它会循环,对数据进行数千次的小批量处理。我将取训练集,选出100个值。有意思的是,我不必对整个55000张图像的训练集进行循环,也不必每次训练。我可以随机选取一百个值,并且仅在每个小批次中进行训练。

这很有意思,如果你喜欢统计你在做的是选出整个训练集,然后选出当中的随机样本进行训练,这将得到训练集的代表性样本。从统计上来说,最终得到的结果近似于对整个训练集进行训练。这类似于你想知道比起其他总统候选人,人们是否喜欢这个候选人。你不需要问每一个美国人或者每个州的人。你可以对随机人群进行询问,得到的结果与实际结果很相近。这样可以节省很多的时间,只需运行实际数据的百分之五,从而节省大量时间。

接下来可以对神经网络进行测试,看其效果如何。这是在TensorFlow中使用的另一种操作,使用argmax函数。这个Y值是从神经网络得出的值,这个质数Y是训练集中得出的实际值,是正确的值。我将对两者都运行argmax函数,这将在输出的每个向量中得出0或者1。最后得出我的神经网络正确率为91%,这实际上很糟糕。十个图像中有一个是不正确的,但这是一个非常简单的例子。

你可以开始做更复杂的例子 使用MNIST,MNIST当中最好的正确率可以达到99.997%。如果用神经网络做的更多,可以得到更正确的数值。

TensorFlow的官网也是很不错的,当中有很多教程。比如这个针对初学者的MNIST例子,关于在TensorFlow上使用MNIST训练集。如果想通过更复杂的操作得到更好的结果,可以试试下一个教程,针对专家的MNIST教程。给原来的神经网络增加了些复杂性,从而提高5%或6%的正确率。还有一些其他教程,比如使用卷积神经网络 递归神经网络等等。有很多例子,都是简单易懂的。这让TensorFlow成为机器学习中非常出色的库。

在这里出于趣味性,我使用MNIST和Theano库,运行了相同的训练数据。Theano库与TensorFlow的方式很类似,使用方法也类似。在这里我会使用TensorFlow例子中,这里你所做的非常类似。在Theano中存在共享对象(shared object),这会用于权重和偏差,而不是用变量。接着你可以对神经网络进行定义,使用相同的softmax 再加上偏差。然后对损失函数和训练步骤定义相同的交叉熵。有点不同的是需要进行反向传播。这里是反向传播,这是梯度下降函数。可以给出代价函数的交叉熵,以及权重和偏差。但需要自己进行更新。

之后就可以用Theano建立训练模型,然后做数千次批次训练 。接着测试,在这里我得到89%正确率。会得到相同的正确率,因为操作类型是相同的。Theano和TensorFlow的区别在于库核心部分的构成。

TensorFlow能够让你更容易分解操作,并且映射到特定的设备中。然而 Theano是核心库,这让它很难或几乎不可能映射到多个GPU或多个设备进行训练。

TensorFlow的与众不同在于分布式训练,这能够对各个GPU和CUP进行映射。并且支持许多不同类型的分布式训练。比如数据并行(data parallelism),以及模型并行(model parallelism)等等。数据并行和模型并行中存在一些取舍,两者得到的结果不同。模型并行会分解模型的不同部分,然后在不同设备不同机器上训练相同的数据。数据并行则是在多台机器上运行相同的模型,并拆分数据。两者都有不同的优缺点。

在谷歌,我们倾向于使用数据并行。但是模型并行性适用于许多不同类型的任务。TensorFlow两者都支持。我不会介绍过多的细节,比如数据并行、同步模型、异步模型。如果你感兴趣的话,可以之后和我聊聊。

当你对这类机器学习模型或训练进行分配时,会存在一些问题。你需要在各个机器之间传输大量的数据,取决于如何分解或分配训练。因此你需要一个快速的神经网络,因为操作在单个GPU上需要花费几纳秒,但是通过网络传输数据需要几毫秒。分布数据的能力上存在数量级的差异。问题的瓶颈在于机器之间的网络。

在谷歌我们致力于这类问题。为了使机器间的连接尽可能快,因此我们计划建立一个云版本,称为Cloud ML。支持在谷歌数据中心运行TensorFlow,能够充分利用谷歌数据中心的硬件,从而进行分布式训练。这可以帮助你减少时间。原来需要8小时如今在20个节点上只需32分钟,快了近15倍。

除了能够利用GPU以及这类硬件,我们也在开发自己的硬件用于机器学习和矩阵乘法。这称为Tensor Processing Unit(TPU)。这是我们在谷歌开发的一种ASIC,为了获得更好的性能。GPU是非常耗能的,所以我们开发了一些耗电少的产品。但是这些是专门针对机器学习的。我们也计划把这些作为云计算学习的一部分。

如果你们对TensorFlow感兴趣,可以看看这些网站。上面有很多例子和教程。这也是TensorFlow很不错的地方。这些教程真的很棒,编写的很好,简单易懂。

还可以看看bit.ly/tensorflow-workshop,很适合构建TensorFlow模型。包括基础和进阶的MNITS例子,还包括如何使用kubernetes,以及使用TensorFlow Serving,构建机器学习的产品版本。如果你感兴趣的话 一定要看看,谢谢大家来听讲座。

你可能感兴趣的:(python使用tensorflow_使用 TensorFlow 和 Python 进行深度学习(附视频中字))