TensorFlow 2.0 实战教程

这是一份来自 IJCAI 2019上的一个 TensorFlow 2.0 实操教程,这个教程包含 117 页 PPT,由 Google 资深开发人员 Josh Gordon 讲授,提供了最新 TensorFlow 2.0 的实操介绍,重点介绍了最佳实践。读者将学习编写几种类型的神经网络(Dense, Convolutional, 和 Recurrent),以及生成对抗网络(Generative Adversarial Network)。

Hands on TensorFlow 2.0
Hands on TensorFlow 2.0

TensorFlow 是一个基于数据流编程(Dataflow Programming)的符号数学系统,被广泛应用于各类机器学习(Machine Learning)算法的编程实现,其前身是谷歌的神经网络算法库 DistBelief。

Tensorflow 拥有多层级结构,可部署于各类服务器、PC 终端和网页并支持 GPU 和 TPU 高性能数值计算,被广泛应用于谷歌内部的产品开发和各领域的科学研究。

如果你想学习新发布的 TensorFlow 2.0 版本,那么本教程非常适合您。不过您需要事先熟悉一些基本的机器学习知识。该教程将介绍深度学习中的关键概念。本教程的目标是帮助您高效地开始使用 TensorFlow,这样您就可以继续自学了。

《Hands on TensorFlow 2.0》教程下载

TensorFlow VS. PyTorch V2

此前,跨象乘云™ 发布过《TensorFlow VS. PyTorch》 —— 谷歌的 Tensorflow 与 Facebook 的 PyTorch 一直是颇受社区欢迎的两种深度学习框架。那么究竟哪种框架最适宜自己手边的深度学习项目呢?本文作者从这两种框架各自的功能效果、优缺点以及安装、版本更新等诸多方面给出了自己的建议。如果你在读这篇文章,那么你可能已经开始了自己的深度学习之旅。如果你对这一领域还不是很熟悉,那么简单来说,深度学习使用了「人工神经网络」,这是一种类似大脑的特殊架构,这个领域的发展目标是开发出能解决真实世界问题的类人计算机。为了帮助开发这些架构,谷歌、Facebook 和 Uber 等科技巨头已经为 Python 深度学习环境发布了多款框架,这让人们可以更轻松地学习、构建和训练不同类型的神经网络。本文将详细介绍和比较两种流行的框架: TensorFlow 与 PyTorch。

谷歌的 TensorFlow

TensorFlow 是谷歌的开发者创造的一款开源的深度学习框架,于 2015 年发布。官方研究发布于论文《TensorFlow:异构分布式系统上的大规模机器学习》。TensorFlow 现已被公司、企业与创业公司广泛用于自动化工作任务和开发新系统,其在分布式训练支持、可扩展的生产和部署选项、多种设备(比如安卓)支持方面备受好评。

Facebook 的 PyTorch

PyTorch 是最新的深度学习框架之一,由 Facebook 的团队开发,并于 2017 年在 GitHub 上开源。有关其开发的更多信息请参阅论文《PyTorch 中的自动微分》。PyTorch 很简洁、易于使用、支持动态计算图而且内存使用很高效,因此越来越受欢迎。接下来还会更详细地介绍。

我们可以用 TensorFlow 和 PyTorch 构建什么?

神经网络起初是被用于解决手写数字识别或用相机识别汽车注册车牌等简单的分类问题。但随着近来框架的发展以及英伟达高计算性能图形处理单元(GPU)的进步,我们可以在 TB 级的数据上训练神经网络并求解远远更加复杂的问题。一个值得提及的成就是在 TensorFlow 和 PyTorch 中实现的卷积神经网络在 ImageNet 上都达到了当前最佳的表现。训练后的模型可以用在不同的应用中,比如目标检测、图像语义分割等等。

尽管神经网络架构可以基于任何框架实现,但结果却并不一样。训练过程有大量参数都与框架息息相关。举个例子,如果你在 PyTorch 上训练一个数据集,那么你可以使用 GPU 来增强其训练过程,因为它们运行在 CUDA(一种 C++ 后端)上。TensorFlow 也能使用 GPU,但它使用的是自己内置的 GPU 加速。因此,根据你所选框架的不同,训练模型的时间也总是各不相同。

TensorFlow 顶级项目

  • Magenta:一个探索将机器学习用作创造过程的工具的开源研究项目
  • Sonnet:这是一个基于 TensorFlow 的软件库,可用于构建复杂的神经网络
  • Ludwig:这是一个无需写代码就能训练和测试深度学习模型的工具箱

PyTorch 顶级项目

  • CheXNet:使用深度学习来分析胸部 X 光照片,能实现放射科医生水平的肺炎监测
  • PYRO:这是一种用 Python 编写的通用概率编程语言(PPL),后端由 PyTorch 支持
  • Horizon:一个用于应用强化学习(Applied RL)的平台

这些只是基于 TensorFlow 和 PyTorch 构建的少量框架和项目。你能在 TensorFlow 和 PyTorch 的 GitHub 和官网上找到更多。

PyTorch 和 TensorFlow 对比

PyTorch 和 TensorFlow 的关键差异是它们执行代码的方式。这两个框架都基于基础数据类型张量(tensor)而工作。你可以将张量看作是下图所示的多维数组。

多维数组
多维数组

机制:动态图定义与静态图定义

TensorFlow 框架由两个核心构建模块组成:

  • 一个用于定义计算图以及在各种不同硬件上执行这些图的运行时间的软件库。
  • 一个具有许多优点的计算图(后面很快就会介绍这些优点)。

计算图是一种将计算描述成有向图的抽象方式。图是一种由节点(顶点)和边构成的数据结构,是由有向的边成对连接的顶点的集合。

当你在 TensorFlow 中运行代码时,计算图是以静态方式定义的。与外部世界的所有通信都是通过 tf.Sessionobject 和 tf.Placeholder 执行,它们是在运行时会被外部数据替换的张量。例如,看看以下代码段:

近期 Keras 被合并到了 TensorFlow 库中,这是一个使用 TensorFlow 作为后端的神经网络框架。从那时起,在 TensorFlow 中声明层的句法就与 Keras 的句法类似了。首先,我们声明变量并将其分配给我们将要声明的架构类型,这里的例子是一个 Sequential() 架构。

接下来,我们使用 model.add() 方法以序列方式直接添加层。层的类型可以从 tf.layers 导入,如下代码片段所示:

TensorFlow 和 PyTorch 的优缺点

TensorFlow 和 PyTorch 各有其优缺点。

TensorFlow 的优点:

  • 简单的内置高级 API
  • 使用 TensorBoard 可视化训练
  • 通过 TensorFlow serving 容易实现生产部署
  • 很容易的移动平台支持
  • 开源
  • 良好的文档和社区支持

TensorFlow 的缺点:

  • 静态图
  • 调试方法
  • 难以快速修改

PyTorch 的优点

  • 类 Python 的代码
  • 动态图
  • 轻松快速的编辑
  • 良好的文档和社区支持
  • 开源
  • 很多项目都使用 PyTorch

PyTorch 的缺点:

  • 可视化需要第三方
  • 生产部署需要 API 服务器

TensorFlow 还是 PyTorch?

PyTorch 和 TensorFlow 近期都发布了新版本:PyTorch 1.0(首个稳定版)和 TensorFlow 2.0(beta 测试版)。这两个版本都有重大的更新和新功能,让训练过程更高效、流畅和强大。

如果你要在自己的机器上安装这些框架的最新版,你可以用源代码 build 或通过 pip 安装。

TensorFlow 是一种非常强大和成熟的深度学习库,具有很强的可视化功能和多个用于高级模型开发的选项。它有面向生产部署的选项,并且支持移动平台。另一方面,PyTorch 框架还很年轻,拥有更强的社区动员,而且它对 Python 友好。

建议是:如果你想更快速地开发和构建 AI 相关产品,TensorFlow 是很好的选择。建议研究型开发者使用 PyTorch,因为它支持快速和动态的训练。

TensorFlow 2.0 构建和部署端到端的图像分类器

2019 年 3 月 6 日,谷歌在 TensorFlow 开发者年度峰会上发布了最新版的 TensorFlow 框架 TensorFlow 2.0 。新版本对 TensorFlow 的使用方式进行了重大改进,使其更加灵活和更具人性化。具体的改变和新增内容可以从 TensorFlow 的官网找到,本文将介绍如何使用 TensorFlow 2.0 构建和部署端到端的图像分类器,以及新版本中的新增内容,包括:

  • 使用 TensorFlow Datasets 下载数据并进行预处理
  • 使用 Keras 高级 API 构建和训练图像分类器
  • 下载 InceptionV3 卷积神经网络并对其进行微调
  • 使用 TensorFlow Serving 为训练好的模型发布服务接口

本教程的所有源代码都已发布到 GitHub 库中,有需要的读者可下载使用。

GitHub地址项目 GitHub 地址

12 大深度学习框架的入门项目

概述

开源框架总览:现如今开源生态非常完善,深度学习相关的开源框架众多,光是为人熟知的就有 caffe,tensorflow,pytorch/caffe2,keras,mxnet,paddldpaddle,theano,cntk,deeplearning4j,matconvnet 等。如何选择最适合你的开源框架是一个问题。一个合格的深度学习算法工程师怎么着得熟悉其中的 3 个以上吧。下面是各大开源框架的一个总览。

开源框架总览
开源框架总览

在这里我们还有一些框架没有放上来,是因为它们已经升级为大家更喜欢或者使用起来更加简单的版本,比如从 torch->pytorch,从 theano 到 lasagne。另外这些框架都支持 CUDA ,因此编程语言这里也没有写上 cuda 。

在选择开源框架时,要考虑很多原因,比如开源生态的完善性,比如自己项目的需求,比如自己熟悉的语言。当然,现在已经有很多开源框架之间进行互转的开源工具如 MMDNN 等,也降低了大家迁移框架的学习成本。

除此之外还有 tiny-dnn,ConvNetJS,MarVin,Neon 等等小众,以及 CoreML 等移动端框架,就不再一一介绍。总的来说对于选择什么样的框架,有三可以给出一些建议。

  1. 不管怎么说,tensorflow/pytorch 你都必须会,是目前开发者最喜欢,开源项目最丰富的框架。
  2. 如果你要进行移动端算法的开发,那么 Caffe 是不能不会的。
  3. 如果你非常熟悉 Matlab,matconvnet 你不应该错过。
  4. 如果你追求高效轻量,那么 darknet 和 mxnet 你不能不熟悉。
  5.  如果你很懒,想写最少的代码完成任务,那么用 keras 吧。
  6. 如果你是 java 程序员,那么掌握 deeplearning4j 没错的。

其他的框架,也自有它的特点,大家可以自己多去用用。

如何学习开源框架

要掌握好一个开源框架,通常需要做到以下几点:

  •  熟练掌握不同任务数据的准备和使用。
  • 熟练掌握模型的定义。
  • 熟练掌握训练过程和结果的可视化。
  • 熟练掌握训练方法和测试方法。

一个框架,官方都会开放有若干的案例,最常见的案例就是以 MNISI 数据接口+预训练模型的形式,供大家快速获得结果,但是这明显还不够,学习不应该停留在跑通官方的 demo 上,而是要解决实际的问题。我们要学会从自定义数据读取接口,自定义网络的搭建,模型的训练,模型的可视化,模型的测试与部署等全方位进行掌握。这是一个二分类任务,给大家准备了500 张微笑表情的图片、500 张无表情的图片,放置在 git 工程的data 目录下,图片预览如下,已经全部缩放到 60*60 的大小:

这是无表情的图片:

无表情的图片
无表情的图片

这是微笑表情的图片:

微笑表情的图片
微笑表情的图片

因此,我们的目标就是利用这 500 张图片完成好这个图像分类任务。

在下面的所有框架的学习过程中,我们都要完成下面这个流程,只有这样,才能叫做真正的完成了一个训练任务。

流程
流程

另外,所有的框架都使用同样的一个模型,这是一个 3 层卷积 +2 层全连接的网络,由卷积+BN 层+激活层组成,有的使用带步长的卷积,有的使用池化,差别不大。

  • 输入图像,48*48*3 的 RGB 彩色图。
  • 第一层卷积,通道数 12,卷积核 3*3。
  • 第二层卷积,通道数 24,卷积核 3*3。
  • 第三层卷积,通道数 48,卷积核 3*3。
  • 第一层全连接,通道数 128。
  • 第二层全连接,通道数 2,即类别数。

这是最简单的一种网络结构,优化的时候根据不同的框架,采用了略有不同的方案。因为此处的目标不是为了比较各个框架的性能,所以没有刻意保持完全一致。

开源框架

下面我们开始对各个框架进行简述。

1.  Caffe

概述:Caffe 是伯克利的贾扬清主导开发,以 C++/CUDA 代码为主,最早的深度学习框架之一,比TensorFlow、Mxnet、Pytorch 等都更早,需要进行编译安装。支持命令行、Python 和 Matlab 接口,单机多卡、多机多卡等都可以很方便的使用。目前 master 分支已经停止更新,intel 分支等还在维护,caffe  框架已经非常稳定。

caffe 的使用通常是下面的流程:

caffe
caffe

以上的流程相互之间是解耦合的,所以 caffe 的使用非常优雅简单。

caffe 有很明显的优点和缺点。

优点:

  • 以 C++/CUDA/python 代码为主,速度快,性能高。
  • 工厂设计模式,代码结构清晰,可读性和拓展性强。
  • 支持命令行、Python 和 Matlab 接口,使用方便。
  • CPU 和 GPU 之间切换方便,多 GPU 训练方便。
  • 工具丰富,社区活跃。

缺点:

  • 源代码修改门槛较高,需要实现前向反向传播,以及 CUDA 代码。
  • 不支持自动求导。
  • 不支持模型级并行,只支持数据级并行
  • 不适合于非图像任务。
caffe
caffe

2. Tensorflow

概述:TensorFlow 是 Google brain 推出的开源机器学习库,可用作各类深度学习相关的任务。TensorFlow = Tensor + Flow,Tensor 就是张量,代表 N 维数组,这与 Caffe 中的 blob 是类似的;Flow  即流,代表基于数据流图的计算。

特点:TensorFlow 最大的特点是计算图,即先定义好图,然后进行运算,所以所有的 TensorFlow 代码,都包含两部分:

  • 创建计算图,表示计算的数据流。它做了什么呢?实际上就是定义好了一些操作,你可以将它看做是Caffe 中的 prototxt 的定义过程。
  • 运行会话,执行图中的运算,可以看作是 Caffe 中的训练过程。只是 TensorFlow 的会话比 Caffe 灵活很多,由于是 Python 接口,取中间结果分析,Debug 等方便很多。
tensorflow
tensorflow

3 . Pytorch

概述:一句话总结 Pytorch = Python + Torch。Torch 是纽约大学的一个机器学习开源框架,几年前在学术界非常流行,包括 Lecun 等大佬都在使用。但是由于使用的是一种绝大部分人绝对没有听过的 Lua 语言,导致很多人都被吓退。后来随着 Python 的生态越来越完善,Facebook 人工智能研究院推出了 Pytorch 并开源。Pytorch 不是简单的封装 Torch 并提供Python 接口,而是对 Tensor 以上的所有代码进行了重构,同 TensorFlow 一样,增加了自动求导。

后来 Caffe2 全部并入 Pytorch,如今已经成为了非常流行的框架。很多最新的研究如风格化、GAN 等大多数采用 Pytorch 源码。

特点:

  • 动态图计算。TensorFlow 从静态图发展到了动态图机制 Eager Execution ,pytorch 则一开始就是动态图机制。动态图机制的好处就是随时随地修改,随处 debug ,没有类似编译的过程。
  • 简单。相比 TensorFlow1.0 中 Tensor、Variable、Session 等概念充斥,数据读取接口频繁更新,tf.nn、tf.layers、tf.contrib 各自重复,Pytorch 则是从 Tensor 到 Variable 再到 nn.Module ,最新的Pytorch 已经将 Tensor 和 Variable 合并,这分别就是从数据张量到网络的抽象层次的递进。有人调侃TensorFlow 的设计是 “make it complicated” ,那么 Pytorch 的设计就是 “keep it simple”。
pytorch
pytorch

4 . Mxnet

概述:  Mxnet 是由李沐等人领导开发的非常灵活,扩展性很强的框架,被 Amazon 定为官方框架。

特点:  Mxnet 同时拥有命令式编程和符号式编程的特点。在命令式编程上 MXNet 提供张量运算,进行模型的迭代训练和更新中的控制逻辑;在声明式编程中 MXNet 支持符号表达式,用来描述神经网络,并利用系统提供的自动求导来训练模型。Mxnet 性能非常高,推荐资源不够的同学使用。

Mxnet
Mxnet

5.  Keras

概述:  Keras 是一个对小白用户非常友好而简单的深度学习框架,严格来说并不是一个开源框架,而是一个高度模块化的神经网络库。

Keras 在高层可以调用 TensorFlow,CNTK,Theano ,还有更多的库也在被陆续支持中。 Keras 的特点是能够快速实现模型的搭建,是高效地进行科学研究的关键。

特点:

  •  高度模块化,搭建网络非常简洁。
  •   API 很简单,具有统一的风格。
  •  容易扩展,只需使用 python 添加新类和函数。
Keras
Keras

6.  Paddlepaddle

概述:  正所谓 Google 有 Tensorflow,Facebook 有 Pytorch,Amazon 有 Mxnet,作为国内机器学习的先驱,百度也有 PaddlePaddle,其中 Paddle 即 Parallel Distributed Deep Learning (并行分布式深度学习)。

特点:  paddlepaddle 的性能也很不错,整体使用起来与 tensorflow 非常类似,拥有中文帮助文档,在百度内部也被用于推荐等任务。另外,配套了一个可视化框架 visualdl,与 tensorboard 也有异曲同工之妙。国产框架不多,大家多支持啊!

paddlepaddle
paddlepaddle

7.  CNTK

概述:  CNTK 是微软开源的深度学习工具包,它通过有向图将神经网络描述为一系列计算步骤。在有向图中,叶节点表示输入值或网络参数,而其他节点表示其输入上的矩阵运算。

CNTK 允许用户非常轻松地实现和组合流行的模型,包括前馈 DNN,卷积网络(CNN)和循环网络(RNN / LSTM)。与目前大部分框架一样,实现了自动求导,利用随机梯度下降方法进行优化。

特点:

  • CNTK 性能较高,按照其官方的说法,比其他的开源框架性能都更高。
  • 适合做语音,CNTK 本就是微软语音团队开源的,自然是更合适做语音任务,使用 RNN 等模型,以及在时空尺度分别进行卷积非常容易。
cntk
cntk

8.  Matconvnet

概述:  不同于各类深度学习框架广泛使用的语言 Python,MatConvnet 是用 matlab 作为接口语言的开源深度学习库,底层语言是 cuda。

特点:  因为是在 matlab 下面,所以 debug 的过程非常的方便,而且本身就有很多的研究者一直都使用 matlab 语言,所以其实该语言的群体非常大。

matconvnet
matconvnet

9. Deeplearning4j

概述:  不同于深度学习广泛应用的语言 Python,DL4J 是为 java 和 jvm 编写的开源深度学习库,支持各种深度学习模型。

特点:  DL4J 最重要的特点是支持分布式,可以在 Spark 和 Hadoop 上运行,支持分布式 CPU 和 GPU 运行。DL4J 是为商业环境,而非研究所设计的,因此更加贴近某些生产环境。

Deeplearning4j
Deeplearning4j

10 .  Chainer

概述:  chainer 也是一个基于 python 的深度学习框架,能够轻松直观地编写复杂的神经网络架构,在日本企业中应用广泛。

特点:  chainer 采用 “Define-by-Run” 方案,即通过实际的前向计算动态定义网络。更确切地说,chainer 存储计算历史而不是编程逻辑,pytorch 的动态图机制思想主要就来源于 chaine

chainer
chainer

11 .  Lasagne/Theano

概述:  Lasagen 其实就是封装了 theano,后者是一个很老牌的框架,在 2008 年的时候就由 Yoshua Bengio 领导的蒙特利尔 LISA 组开源了。

特点:  theano 的使用成本高,需要从底层开始写代码构建模型,Lasagen 对其进行了封装,使得 theano 使用起来更简单。

Theano
Theano

12 .  Darknet

概述:  Darknet 本身是 Joseph Redmon 为了 Yolo 系列开发的框架。
Joseph Redmon 提出了 Yolo v1,Yolo v2,Yolo v3。

Darknet
Darknet

特点:  Darknet 几乎没有依赖库,是从 C 和 CUDA 开始撰写的深度学习开源框架,支持 CPU 和 GPU。Darknet跟 caffe 颇有几分相似之处,却更加轻量级,非常值得学习使用。

TensorFlow 简介与概览 – Part 8/8

深度强化学习 (Deep RL)
深度强化学习 (Deep RL)

强化学习 (RL) 是一种框架,可以教导智能体如何以使奖励最大化的方式在现实世界中采取行动。我们将由神经网络完成的学习称为深度强化学习 (Deep RL)。RL 框架有三种类型:基于策略、基于值和基于模型。三者的区别在于神经网络需要学习的内容。如需了解更多详情,请观看 MIT 课程 6.S091 的 Deep RL 简介讲座。当我们需要作出一系列决策时,可以借助 Deep RL 在模拟环境或真实环境中应用神经网络。其中包括游戏操作、机器人、神经架构搜索等等。DeepTraffic 环境提供了教程与代码示例,可以让您快速地在浏览器中探索、训练和评估 Deep RL 智能体。

GitHub地址项目 GitHub 地址

TensorFlow 简介与概览 – Part 7/8

生成对抗网络 (GAN)


生成对抗网络 (GAN)
生成对抗网络 (GAN)
GAN 是一种训练网络框架,已经过优化,可以通过特定表征生成新的真实样本。简单而言,其训练过程涉及两个网络。其中一个网络称为 生成器 (generator),它会生成新的数据实例并试图欺骗另一个网络,即判别器 (discriminator),后者会对图像的真伪进行分类。

在过去几年,GAN 出现了许多变体和改进,包括从特定类别生成图像的能力,以及将图像从一个域映射到另一个域的能力,而且所生成图像的真实度也有极大提升。TensorFlow 教程:如需 GAN 早期变体的示例,请参阅有关 条件GAN 和 DCGAN 的教程。

GitHub地址项目 GitHub 地址 – 条件 GAN
GitHub地址项目 GitHub 地址 – DC GAN

TensorFlow 简介与概览 – Part 6/8

自动编码器

自动编码器
自动编码器

自动编码器是其中一种更简单的 “无监督学习” 形式,其采用编码器 — 解码器架构,并学习生成输入数据的精确副本。由于编码表征比输入数据小得多,此网络被迫学习如何生成最有意义的表征。

其 Ground truth 数据来自输入数据,因此无需人工操作。换言之,此网络可自我监督。其应用包括无监督嵌入、图像降噪等。但最重要的是,其 “表征学习” 的基本思想是下个部分的生成模型与所有深度学习的核心。在这个 TensorFlow Keras 教程 中,您可以探索自动编码器在以下两方面的功能:

  1. 对输入数据进行降噪
  2. 在 MNIST 数据集中生成嵌入

TensorFlow 简介与概览 – Part 5/8

编码器 / 解码器架构

编码器-解码器架构
编码器-解码器架构

前 3 部分介绍的 FFNNCNNRNN 都只是分别使用密集编码器、卷积编码器或递归编码器进行预测的网络。这些编码器可以组合或切换,具体取决于我们尝试生成有用表征的原始数据类型。“编码器 — 解码器” 架构是一种更高层次的概念,此架构基于编码步骤而构建,通过对压缩表征进行上采样的步骤来生成高维输出,而不是进行预测。

请注意,编码器与解码器彼此之间可能大不相同。例如,图像描述生成 (image captioning) 网络可能采用卷积编码器(用于图像输入)和递归解码器(用于自然语言输出)。其应用包括语义分割、机器翻译等。请参阅 MIT 驾驶场景分割教程,其中展示了用于处理无人车辆感知问题的最先进分割网络:

利用 TensorFlow 进行驾驶场景分割
利用 TensorFlow 进行驾驶场景分割

GitHub地址项目 GitHub 地址

TensorFlow 简介与概览 – Part 4/8

递归神经网络 (RNN)

RNN 是具有循环的网络
RNN 是具有循环的网络

RNN 是具有循环的网络,因此具有 “状态记忆”。这种网络可适时展开,以成为共享权重的前馈网络。正如 CNN 可跨 “空间” 共享权重一样,RNN 可跨 “时间” 共享权重。这使其能够处理并有效表示序列数据中的模式。

我们已开发出 RNN 模块的许多变体(包括 LSTM 和 GRU),以帮助学习较长序列中的模式。其应用包括自然语言建模、语音识别、语音生成等。递归神经网络的训练颇具挑战性,但同时也让我们可以对序列数据进行一些有趣而强大的建模。利用 TensorFlow 生成文本 是我最喜欢的教程之一,因为只需几行代码便可完成一些事情:逐字生成合理文本。

利用 TensorFlow 生成文本
利用 TensorFlow 生成文本

GitHub地址项目 GitHub 地址

TensorFlow 简介与概览 – Part 3/8

卷积神经网络 (CNN)

CNN(又名 ConvNet)是一种前馈神经网络
CNN(又名 ConvNet)是一种前馈神经网络

CNN(又名 ConvNet)是一种前馈神经网络,其使用空间不变性技巧来有效学习图像中最常见的局部模式。举例而言,若图像左上方与右下方的猫耳拥有相同的特征,我们便可将其称为空间不变性。CNN 可跨空间共享权重,从而更高效地检测出猫耳及其他模式。

CNN 不是只使用密集连接层,而是使用卷积层(卷积编码器)。这些网络可用于图像分类、对象检测、视频动作识别,以及任何在结构上具备一些空间不变性的数据(例如语音音频)。

了解用于对 MNIST 数据集中的手写数字进行分类的 CNN 示例。我们利用影像变形技术创造梦幻般的精彩扭曲效果,并通过数据集之外生成的高分辨率手写数字对分类器进行测试:

利用影像变形技术生成手写数字(左侧)并进行分类预测(右侧)
利用影像变形技术生成手写数字(左侧)并进行分类预测(右侧)

GitHub地址项目 GitHub 地址

TensorFlow 简介与概览 – Part 2/8

前馈神经网络 (FFNN)

FFNN 的历史可以追溯至 20 世纪 40 年代,只是一种没有任何循环的网络。数据以单次传递的方式从输入传递至输出,而没有任何之前的 “状态记忆”。从技术上讲,深度学习中的大多数网络均可被视为 FFNN,但 “FFNN” 通常指的是其最简单的变体:一种密集连接的多层感知器 (MLP)。密集编码器用于将输入上已经很紧凑一组数字映射至预测:分类(离散)或回归(连续)数据。

以下是一个用于预测波士顿房价的 FFNN 示例,属于回归问题:

GitHub地址项目 GitHub 地址

TensorFlow 简介与概览 – Part 1/8

深度学习是表征学习,即通过数据自动生成有用的表征。我们表述世界的方式可以使复杂事物简单化,让人类及我们构建的机器学习模型能够容易理解。哥白尼于 1543 年发表的日心说模型。与先前以地球为中心的地心说模型不同,该模型将太阳置于 “宇宙” 的中心。在最佳情况下,深度学习让我们可以自动处理此步骤,无需哥白尼(即人类专家)即可完成 “特征工程” 过程:

从高层次来看,神经网络可以是编码器、解码器或二者的结合:

  • 编码器会在原始数据中找到模式,以生成简洁有用的表征
  • 解码器会利用这些表征生成高分辨率数据。所生成的数据是新示例或描述性知识

其余是一些巧妙方法,可帮助我们有效处理视觉信息、语言和音频,甚至可以帮助我们根据这些信息和偶尔的奖励在现实世界中采取行动。以下是总体图示:

在下面的部分,将分别简要描述这 7 种架构范例,每种范例均提供 TensorFlow 教程链接,以作说明。

TensorFlow 支持 Unicode 编码

TensorFlow 现在可以支持 Unicode,这是一种标准编码系统,可以表示几乎所有语言的字符。处理自然语言时,了解字符的编码方式非常重要。在像英语这样的小字符集的语言中,每个字符都可以使用 ASCII 进行表示。但是这种方法对于其他语言来说并不实用,例如中文,这些语言有数千个字符。即使处理英文文本,Emojis 等特殊字符也不能用 ASCII 表示。

定义字符及其编码的最常用标准是 Unicode,它几乎支持所有语言。对于 Unicode,每个字符使用唯一的整数 code point 表示,其值介于 0 和 0x10FFFF 之间。当按顺序放置 code point 时,将形成 Unicode 字符串。

Unicode Tutorial Colab 展示了如何在 TensorFlow 中表示 Unicode 字符串。使用 TensorFlow 时,有两种标准方式来表示 Unicode 字符串:

  • 作为整数向量,其中每个位置包含单个 code point
  • 作为字符串,使用字符编码将 code point 序列编码到字符串中。有许多字符编码,其中一些最常见的是 UTF-8,UTF-16 等

吴恩达深度学习教程中文笔记

8 月 8 日,吴恩达在他自己创办的在线教育平台 Coursera 上线了他的人工智能专项课程(Deep Learning Specialization)。此课程广受好评,通过视频讲解、作业与测验等让更多的人对人工智能有了了解与启蒙,国外媒体报道称:吴恩达这次深度学习课程是迄今为止,最全面、系统和容易获取的深度学习课程,堪称普通人的人工智能第一课。这些课程专为已有一定基础(基本的编程知识,熟悉 Python、对机器学习有基本了解),想要尝试进入人工智能领域的计算机专业人士准备。介绍显示:“深度学习是科技业最热门的技能之一,本课程将帮你掌握深度学习。”

在这 5 堂课中,学生将可以学习到深度学习的基础,学会构建神经网络,并用在包括吴恩达本人在内的多位业界顶尖专家指导下创建自己的机器学习项目。Deep Learning Specialization 对卷积神经网络 (CNN)、递归神经网络 (RNN)、长短期记忆 (LSTM) 等深度学习常用的网络结构、工具和知识都有涉及。

课程中也会有很多实操项目,帮助学生更好地应用自己学到的深度学习技术,解决真实世界问题。这些项目将涵盖医疗、自动驾驶、和自然语言处理等时髦领域,以及音乐生成等等。Coursera 上有一些特定方向和知识的资料,但一直没有比较全面、深入浅出的深度学习课程——《深度学习专业》的推出补上了这一空缺。

课程的语言是 Python,使用的框架是 Google 开源的 TensorFlow。最吸引人之处在于,课程导师就是吴恩达本人,两名助教均来自斯坦福计算机系。完成课程所需时间根据不同的学习进度,大约需要3-4个月左右。学生结课后,Coursera 将授予他们 Deep Learning Specialization 结业证书。

“我们将帮助你掌握深度学习,理解如何应用深度学习,在人工智能业界开启你的职业生涯。”

吴恩达在课程页面中提到。

GitHub地址项目 GitHub 地址

TensorFlow 推出模型优化工具包,可将模型压缩75%

近日,TensorFlow 推出了一款新的模型优化工具包。利用该该工具包中的技术可以将模型压缩 75%,最大可将速度提升到原来的 3 倍。新手和熟练的开发者都能利用这套工具包中的技术来优化待部署和执行的机器学习模型。预计该工具包中的技术将有助于优化所有 TensorFlow 模型以进行部署,但它对于那些为内存紧张、功率和存储受限的设备提供模型的 TensorFlow Lite 开发人员来说帮助最大。

添加的第一项支持技术是对 TensorFlow Lite 转换工具的训练后量化(post-training quantization)。对于相关的机器学习模型,利用该技术可以将模型压缩到原来的 1/4,并将速度提升到原来的 3 倍。开发者可以通过量化模型减少能耗。这点对于在边缘设备中部署(不局限于手机)非常有用。

训练后量化技术是 TensorFlow Lite 转换工具的一部分。上手非常简单:创建 TensorFlow 模型之后,开发者可以简单地实现 TensorFlow Lite 转换工具中的「post_training_quantize」标记。假设这一保存的模型存储在 saved_model_dir 中,则可以生成量化的 tflite flatbuffer:

TensorFlow 提供了相关教程,深入解析如何做到这一点。未来的目标是将这种技术纳入通用的 TensorFlow 工具中,以便将其部署在目前没有 TensorFlow Lite 支持的平台上。好处在于 ——

  • 模型缩小到原来的 1/4
  • 主要由卷积层组成的模型执行速度提高了 10-50%。
  • 基于 RNN 的模型得到了 3 倍的加速
  • 由于减少了内存和计算需求,预计大多数模型将降低功耗。