一文上手TensorFlow2.0(一)
目录:
- Tensorflow2.0 介绍
- Tensorflow 常见基本概念
- 从1.x 到2.0 的变化
- Tensorflow2.0 的架构
- Tensorflow2.0 的安装(CPU和GPU)
Tensorflow2.0 的使用
- 使用 GPU 加速
从现在开始我们就正式进入TensorFlow2.0的学习了,在这一系列文章里我们将重点介绍TensorFlow的基础知识和使用方法,为后面我们使用TensorFlow去解决一些实际的问题做好准备。2019年3月的TensorFlow开发者峰会上,TensorFlow2.0 Alpha版正式发布,2.0版相比之前的1.x(1.x泛指从1.0到1.13的各个TensorFlow版本)版做了很大的改进,在确保灵活性和性能的前提下易用性得到了很大的提升,对于初次接触TensorFlow的读者来说,建议直接从2.0版开始使用。
1. TensorFlow2.0 介绍
Google在2011年启动了谷歌大脑(GoogleBrain)项目,该项目旨在探索超大规模的深度神经网络,一方面用于研究,另一方面也是希望可以在Google的各类产品中使用,DistBelief分布式机器学习框架便是该项目的一部分。DistBelief曾在Google内部得到了广泛的使用,有超过50个Google(包括其子公司)的团队在他们的产品中使用DistBelief部署了深度神经网络,包括Google搜索,Google广告,Google地图,Google的语音识别系统以及YouTube等。
TensorFlow是Google在DistBelief的经验和基础上开发的第二代大规模分布式机器学习系统,可能是希望打造一个行业标准,以及借助社区的力量来完善TensorFlow等目的,Google于2015年11将TensorFlow开源在了GitHub上。从TensorFlow1.0正式版发布(2017年2月)到现在TensorFlow2.0的Alpha版发布(2019年3月)过去了整整2年,TensorFlow已经成为了各类深度学习框架中的主力军。
TensorFlow使用数据流模型来描述计算过程,并将它们映射到了各种不同的硬件平台上,包括Linux、Max OS X、Windows、Android和iOS等,从x86架构到ARM架构,从拥有单个或多个CPU的服务器到大规模GPU集群。凭借着统一的架构,TensorFlow可以跨越多种平台进行部署,显著地降低了机器学习系统的应用部署难度。
TensorFlow2.0采用了更加简单化的新框架,在保证性能和灵活性的前提下易用性得到了很大程度的提升。
1.1 TensorFlow常见基本概念
在这一小节里我们只对TensorFlow中的一些基本概念做一个简单的介绍,希望进一步了解这些概念及其实现的读者,可以参考官方的白皮书(主要是15年的)以及TensorFlow官网的一些文档。需要注意的是,这些资料中的部分内容对于TensorFlow2.0来说已经不适用了,读者在阅读的时候需要留意。
1. 计算图计算图(computation graph)是一个有向图(directed graph),是对TensorFlow中计算任务的抽象描述,也称为数据流图(data flow graph)。TensorFlow使用计算图将计算表示成了独立的指令之间的依赖关系,在计算图中,节点表示计算单元(即一个独立的运算操作),图中的边表示计算使用或产生的数据。在TensorFlow1.x版本中,当我们使用TensorFlow低级API进行编程时,我们首先需要定义好计算图,然后创建TensorFlow会话(session)来执行计算图。
在TensorFlow1.x版本中采用的是静态图机制,我们需要预先定义好计算图,然后再可以反复的调用它(1.x版本有提供Eager Execution接口,让用户可以使用动态图)。TensorFlow2.0则采用了动态图机制(1.x版本的Eager Execution在2.0中成为了默认的执行方式),我们可以像执行普通的python程序一样执行TensorFlow的代码,而不再需要自己预先定义好静态图,调试代码也更加容易。TensorFlow1.x的静态图机制一直被用户所诟病,调整为动态图机制是TensorFlow2.0一个最重大的改进,并且其也提供了一些方法来保留静态计算图的一些优势。
2. 会话在1.x版本中,会话(session)是客户端程序与TensorFlow系统进行交互的接口,我们定义好的计算图必须在会话中执行。当会话被创建时会初始化一个空的图,客户端程序可以通过会话提供的“Extend”方法向这个图中添加新的节点来创建计算图,并通过“tf.Session”类提供的“run”方法来执行计算图。大多数情况下我们只需要创建一次会话和计算图,之后我们可以在会话中反复执行整个计算图或者其中的某些子图。TensorFlow2.0采用了动态图机制,我们不需要在会话中执行计算图了,“tf.Session”类被放到了兼容模块“tensorflow.compat.v1”中,这个模块里有完整的TensorFlow1.x的API。为了保留静态图的优势(例如性能优化和可移植性等),TensorFlow2.0提供了“tf.function”方法,使用“tf.function”修饰的python函数,TensorFlow可以将其作为单个图来运行。
3. 运算操作和运算核计算图中的每一个节点就是一个运算操作(operation,通常简称op),每一个运算操作都有名称,并且代表了一种类型的抽象运算,例如“MatMul”代表矩阵的乘法。每个运算操作都可以有自己的属性,但是所有的属性都必须被预先设置,或者能够在创建计算图时根据上下文推断出来。通过设置运算操作的属性可以让运算操作支持不同的张量(tensor)元素类型,例如让向量加法操作运算只接受浮点类型的张量。运算核(kernel)是一个运算操作在某个具体的硬件(比如CPU或GPU)上的实现,在TensorFlow中可以通过注册机制加入新的运算操作或者为已有的运算操作添加新的运算核。
表2-1所示是TensorFlow中一些内建运算操作。
表2-1 TensorFlow的部分运算操作4. 张量张量(tensor)可以看作是一个多维的数组或列表,它是对矢量和矩阵的更高维度的泛化,张量由“tf.Tensor”类定义。计算图中的一个运算操作可以获得零个或多个张量作为输入,运算后会产生零个或多个张量输出。这些张量在计算图的边中流动(flow),从一个节点(运算操作)到另一个节点,TensorFlow也因此而得名。
张量具有以下两个属性:
数据类型(同一个张量中的每个元素都具有相同的数据类型,例如float32、int32以及string)
形状(即张量的维数以及每个维度的大小)
表2-2所示是张量的形状示例。
表2-2 TensorFlow中张量的形状示例TensorFlow中有一些特殊的张量,以下是一些主要的特殊张量:
tf.Variable(变量,TensorFlow中的张量一般都不会被持久化保存,参与一次运算操作后就会被丢弃了。变量(variable)是一种特殊的运算操作,它可以将一些需要持久化保存的张量存储在内存或显存中,并会返回一个可以对该变量所引用的张量进行一系列特定操作的句柄,例如Assign和AssignAdd(等同于“+=”)等。模型的参数是保存在变量中的,在模型的训练过程中,参数在不断地更新。变量的值可以修改,但是维度不可以变。)
tf.constant(常量,常量定义时必须初始化值,且定义后其值和维度不可再改变。)
tf.placeholder(占位符,在执行“session.run()”方法时传入具体的值,TensorFlow2.0中不再使用,但依然可以在“tensorflow.compat.v1”模块中找到。)
tf.SparseTensor(稀疏张量)
1.2 从1.x到2.0的变化
TensorFlow 2.0在1.x的基础上做了重新设计,重点放在了提升开发人员的工作效率上,确保2.0版本更加的简单易用。TensorFlow 2.0为了提升易用性做了很多改进,例如对API做了精简,删除了冗余的API,使得API更加一致(例如统一了TensorFlow和tf.keras的循环神经网络和优化器等),以及由静态计算图转变为了动态计算图等(这使得代码的编写和调试变得更加容易)。接下来我们看看TensorFlow 2.0的一些主要变化。
1. API精简很多TensorFlow 1.x的API在2.0中被去掉或者改变了位置,还有一些则被新的API给替换掉了。官方提供了一个转换工具,可以用来将1.x版本的代码升级到2.0,其主要的工作其实就是修改这些有变更的API。不过使用该工具不一定能够转换成功,转换成功后的代码也并不一定能够正常运行,很多时候还是需要人工修改。
2. Eager executionEagerexecution(动态图机制)是TensorFlow 从1.8版本开始正式加入的,但只是作为一种可选操作,在TensorFlow 2.0之前,TensorFlow默认的模式都是Graph execution(静态图机制),TensorFlow 2.0将Eager execution做为了默认模式。在该模式下用户能够更轻松的编写和调试代码,可以使用原生的Python控制语句,大大降低了学习和使用TensorFlow的门槛。在TensorFlow 2.0中,图(graph)和会话(session)都变成了底层实现,而不需要用户关心了。
3. 取消全局变量TensorFlow 1.x非常依赖隐式全局命名空间。当我们调用“tf.Variable”创建变量时,该变量就会被放进默认的图中,即使我们忘记了指向它的python变量,它也会留在那里。当我们想恢复这些变量时,我们必须知道该变量的名称,如果我们没法控制这些变量的创建,也就无法做到这点。TensorFlow 1.x中有各种机制旨在帮助用户再次找到他们所创建的变量,而在2.0中则取消了所有这些机制,支持默认的机制:跟踪变量。当我们不再用到创建的某个变量时,该变量就会被自动回收。
4. 使用函数而不是会话在TensorFlow 1.x中,我们使用“session.run()”方法执行计算图,“session.run()”方法的调用类似于函数调用:指定输入数据和调用的方法,最后返回输出结果。为了保留静态图的一些优势,例如性能优化以及重用模块化的TensorFlow函数等,在TensorFlow2.0中,我们可以使用“tf.function()”来修饰python函数以将其标记为即时(Just-In-Time)编译,从而TensorFlow可以将其作为单个图来执行。
1.3 TensorFlow2.0的架构
Tensorflow作为全球最受欢迎、使用最为广泛的机器学习平台之一,在其发展的三年时间里,也是机器学习和人工智能发展最为迅猛的三年。TensorFlow2.0是一个重要的里程碑,其重心放在了简单性和易用性上,尽量降低用户使用的门槛。在TensorFlow成长的这几年里,TensorFlow团队为其添加了许多的组件,在TensorFlow2.0里,这些组件被打包成了一个全面的平台,它支持从训练到部署的标准化的机器学习流程。如图2-1所示是TensorFlow2.0架构的简化概念图。
图2-1 TensorFlow2.0架构的简化概念图接下来我们结合图2-1介绍一下TensorFlow2.0的基本工作流程以及对应可以使用的API,在2.3节里我们会根据TensorFlow的官方文档重点介绍一下“tf.data”和“tf.keras”这两个API,让读者快速入门TensorFlow2.0的使用。其它的API,读者可以结合官方的文档在本书后续的项目实战中慢慢熟悉和掌握。
1. 使用tf.data加载数据我们使用tf.data创建的输入管道来读取训练数据,并可以通过tf.feature_column来指定特征列或者交叉特征。
2. 使用tf.keras或PremadeEstimators构建、训练和验证模型tf.keras作为TensorFlow的核心高级API,其已经和TensorFlow的其余部分紧密集成,使用tf.keras可以简单、快捷的构建我们的模型。另外tf.estimator中打包了一些标准的模型供我们直接使用,例如逻辑回归、提升树以及随机森林等。当我们不想从头开始训练一个模型时(例如这个模型的训练可能非常耗时),我们可以使用TensorFlow Hub模块来进行迁移学习。
3. 使用eager execution运行和调试模型,以及使用tf.function充分利用计算图的优势前面已经介绍过,在eager execution模式下,我们可以更加方便的编写和调试代码,在TensorFlow2.0中该模式是默认开启的。我们可以使用tf.function来将python程序转换为TensorFlow的静态计算图,这样就可以保留TensorFlow1.x版本中的静态计算图的一些优势。
4. 使用Distribution Strategies进行分布式训练对于大规模的机器学习训练任务,tf.distribute.StrategyAPI旨在让用户只需要对现有的模型和代码做最少的更改,就可以实现分布式的训练。TensorFlow支持CPU、GPU以及TPU等硬件加速器,我们可以将训练任务分配到单节点/多加速器以及多节点/多加速器。
5. 使用SavedModel存储模型在TensorFlow中有两种模型存储的格式,一个是检查点(checkpoints),另一个是SavedModel,前者依赖于创建模型的源代码,而后者则与创建模型的源代码无关,因此标准化后的SavedModel可以作为TensorFlow Serving、TensorFlow Lite、TensorFlow.js或者其它编程语言的交换格式。
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/
欢迎关注PyTorch官方中文教程站:
http://pytorch.panchuang.net/
一文上手TensorFlow2.0(一)的更多相关文章
- 一文上手Tensorflow2.0(四)
系列文章目录: Tensorflow2.0 介绍 Tensorflow 常见基本概念 从1.x 到2.0 的变化 Tensorflow2.0 的架构 Tensorflow2.0 的安装(CPU和GPU ...
- 一文上手Tensorflow2.0之tf.keras(三)
系列文章目录: Tensorflow2.0 介绍 Tensorflow 常见基本概念 从1.x 到2.0 的变化 Tensorflow2.0 的架构 Tensorflow2.0 的安装(CPU和GPU ...
- 『TensorFlow2.0正式版』TF2.0+Keras速成教程·零:开篇简介与环境准备
此篇教程参考自TensorFlow 2.0 + Keras Crash Course,在原文的基础上进行了适当的总结与改编,以适应于国内开发者的理解与使用,水平有限,如果写的不对的地方欢迎大家评论指出 ...
- _00024 尼娜抹微笑伊拉克_云计算ClouderaManager以及CHD5.1.0群集部署安装文档V1.0
笔者博文:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...
- 基于tensorflow2.0 使用tf.keras实现Fashion MNIST
本次使用的是2.0测试版,正式版估计会很快就上线了 tf2好像更新了蛮多东西 虽然教程不多 还是找了个试试 的确简单不少,但是还是比较喜欢现在这种写法 老样子先导入库 import tensorflo ...
- Google工程师亲授 Tensorflow2.0-入门到进阶
第1章 Tensorfow简介与环境搭建 本门课程的入门章节,简要介绍了tensorflow是什么,详细介绍了Tensorflow历史版本变迁以及tensorflow的架构和强大特性.并在Tensor ...
- TensorFlow2.0(1):基本数据结构—张量
1 引言 TensorFlow2.0版本已经发布,虽然不是正式版,但预览版都发布了,正式版还会远吗?相比于1.X,2.0版的TensorFlow修改的不是一点半点,这些修改极大的弥补了1.X版本的反人 ...
- 『TensorFlow2.0正式版教程』极简安装TF2.0正式版(CPU&GPU)教程
0 前言 TensorFlow 2.0,今天凌晨,正式放出了2.0版本. 不少网友表示,TensorFlow 2.0比PyTorch更好用,已经准备全面转向这个新升级的深度学习框架了. 本篇文章就 ...
- TensorFlow2.0(9):TensorBoard可视化
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
随机推荐
- 游LeetCode一月之闲谈
今年的2月比往常更长,不是因为比往年多了一天,而是被病毒隔离在家的日子显得十分漫长.如果再不给自己找点事情做的话,且不论身体方面的健康状况,精神方面可能也会有些隐忧.做为一名工程师,适时地读上几本平日 ...
- string类中getline函数的应用
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- percona-toolkit 之 【pt-query-digest】使用
背景 关于pt-query-digest的使用场景和方法在percona-toolkit 之 [pt-query-digest]介绍文章里已经做了详细说明,现在开始介绍下如何使用,以及常用的命令. 使 ...
- 浅谈.NET Framework 与CLR
承载公共语言运行时 (CLR) 的所有应用程序均需启动(或称“激活”)CLR 以运行托管代码. 通常,.NET Framework 应用程序在生成它的 CLR ...
- SpringBoot&Shiro实现用户认证
SpringBoot&Shiro实现用户认证 实现思路 思路:实现认证功能主要可以归纳为3点 1.定义一个ShiroConfig配置类,配置 SecurityManager Bean , Se ...
- CMSampleBufferRef解析
CMTime:64位的value,32位的scale, media的时间格式 CMVideoFormatDesc:video的格式,包括宽高.颜色空间.编码格式.SPS.PPS CVPixelBuff ...
- 《前端之路》--- 重温 Egg.js
目录 <前端之路>--- 重温 Egg.js 一.基础功能 > 日志系统包含了 四大层面的 日志对象, 分别是 App Logger.App CoreLogger.Context L ...
- FCC 成都社区·前端周刊 第 4 期
01. Angular, React or Vue? 如何为下一个 Web 应用程序选择合适的JavaScript 框架?Progress 的新白皮书提供了对 Angular.React 和 Vue ...
- Anaconda3环境下安装OpenCV(cv2)
Anaconda3环境下安装OpenCV(cv2) 主要步骤 1 首先查看自己的Anaconda安装的python版本 2 下载相应的OpenCv.whl文件 3 使用cmd安装.whl文件 查看自己 ...
- python高阶函数&异常处理
高阶函数 1.什么是高阶函数 在Python中,变量可以指向函数 函数名也是变量 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. ma ...