您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>数值算法/人工智能>

TensorFlow开源模型解析

大小:0.6 MB 人气: 2017-09-29 需要积分:1

  你知道你可以使用 TensorFlow 来描述图像、理解文本和生成艺术作品吗?来这个演讲,你体验到 TensorFlow 在计算机视觉、自然语言处理和计算机艺术生成上的最新项目。我将分享每个领域内我最偏爱的项目、展示你可以在家尝试的实时演示以及分享你可以进一步学习的教育资源。这个演讲不需要特定的机器学习背景。

  

  在进入正题之前,Gordon先谈了谈他对可复现的研究(reproducible research)的看法。他说我们现在理所当然地认为我们可以使用深度学习做到很多事情。在2005年的时候,他用了6个月时间试图使用神经网络来做基本的图像分类——识别分辨细胞是否感染了疾病。虽然那时候已经有很多不错的软件库可用了,但他们仍然还是要手动编写许多神经网络代码。最后,六个月时间过去了,这些优秀工程师打造的网络才开始在二元分类任务上表现得足够好一点。

  而今天,你再也不需要这么苦恼了。今天,一个优秀的Python开发者加一点TensorFlow背景知识,并且愿意使用开源的模型,那么仅需要几天时间就能实现远远超过之前 6 个月所能达到的效果。当然,这要归功于大学、公司、开发者等慷慨的分享,这也已经为我们的社会带来了很大的价值。

  Gordon举了一个例子说明。他说过去8个月有三种新的医学图像应用都依赖于一种被称为Inception的深度学习神经网络模型,这些应用都实现了非常卓越的表现,有望在人类的生命健康方面提供方便实用的帮助。

  既然深度学习这么有用?那么深度学习是怎么工作的呢?首先我们先来看看一个可以将图像分类为「猫」或「狗」的模型。通过这个模型,我们可以看到深度学习与Gordon在2005年的工作有什么不同。

  Gordon解释说,在2005年时,为了开发图像分类器,他编写了Python代码来提取图像的特征。首先他需要构思这个图像分类器需要怎样的特征(比如:线、形状、颜色),甚至还可能需要OpenCV这样的库来做人脸检测

  而使用深度学习时,可以直接为模型输入原始像素,让模型自己去寻找分类所需的特征。“深度学习”之所以被称为“深度”,是因为它具有多个层,数据在这些层中进行处理,最后得到分类结果。

  TensorFlow是由谷歌设计的一个深度学习框架,拥有很多优点,包括快速灵活可扩展的开源机器学习库、可用于研究和生产、可以运行在 CPUGPU、TPU、安卓、iOS树莓派硬件和系统上。

  

  Gordon将在这个演讲中为我们主要解读以下 4 个重要研究:

  

  此外,Gordon还提到了一些其它使用TensorFlow实现的研究成果:

  

  谷歌的这些研究中有一些仍然是当前最佳的,但他们仍然开源了相关的代码,任何人都可以免费尝试复现这些结果。那谷歌为什么还要开源呢?毕竟有的研究是非常具有商业价值的。Gordon 说:“一个重要的理由是可以激励别人继续推进你的想法。”同时,这也能帮助降低开发者的进入门槛,能让更多人参与进来。

  要实现可复现的(reproducible)开源,你需要共享你的代码和数据集。代码方面,要做到可复现,你应该共享你所有的代码,包括训练、推理和验证的代码。数据集方面,你应该说明你所用的数据集,你对数据集的处理方式等等。最好能提供一个试用数据集(toy dataset),让人们可以轻松验证你的模型。

  预训练的检查点(pretrained checkpoint)也很重要。pretrained checkpoint 是为了保存模型训练过程中一些列状态,这样其他研究者就可以完全复制之前的研究过程,从而避免被随机化(在深度学习中极为常见)等其他因素干扰。

  Gordon还谈到了Docker。很多时候,你的开发环境需要大量的依赖包。通过共享一个Docker容器,你可以让其他人快速尝试你的想法。

  开发深度学习模型,当然可以选择自己写代码。在TensorFlow中,你可以轻松编写代码,实现模型。这里给出了两个示例:

  

  这段代码使用Keras+TensorFlow的组合。Keras是用来构建神经网络的API,它具有简单高效的特性,允许初学者轻松地建立神经网络模型;同时,Keras也可以使用TensorFlow作为运行的后端,极大地加速了开发与训练的过程。

  

  首先我们使用Keras中的Sequential类初始化一个用于存放任意层网络的模型,我们可以简单地认为这个类创建了一个杯子,我们的任务就是用适当的内容将这个杯子填满。接着在代码中不断地调用add方法按照顺序添加我们需要的神经网络层 (layer)。我们可以看到短短的几行代码便可以创建一个MNIST神经网络分类器。你只需要专注于以下几个方面:将数据按照神经网络的输入(代码中为一行 model.add(Dense(512, activation=’relu’, input_shape=(784,)))格式处理好,选择适当的激活函数(不仅是relu,你也可以尝试tanh或是softmax来快速比较不同激活函数对神经网络结果的影响),是否添加Dropout层来减轻学习过程中的过拟合现象。

  当模型构建好之后,我们便可以快速地使用compile方法来编译模型,其中的损失函数loss、优化方法optimizer均可以自由选择。最后,使用类似于sklearn机器学习工具包中的fit方法即可开始训练我们的模型。

  

  TensorFlow有一个非常出色可视化工具TensorBoard,可以协助你的开发。

  

  除了自己动手开发,你也可以利用别人写好的代码,这也是开源的好处,也是本演讲所关注的重点。

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!