TensorFlow 2.0入门指南(一)

思腾合力(天津)科技有限公司成立于2008年,定位于视觉计算推动公司,是一家专注于提供人工智能领域、深度学习解决方案、gpu高性能计算、虚拟化等解决方案的厂商。思腾合力自有品牌gpu服务器、x86服务器等入围中央政府采购,成为中央政府采购中标厂商。核心产品均通过了ccc认证,且公司获得了is9001质量管理体系认证。公司主营:gpu高性能服务器、工作站、gpu加速卡、dgx超级计算机、nvidia运算卡,思腾合力(天津)科技有限公司是一家专注于提供人工智能领域、深度学习解决方案、gpu高性能计算、虚拟化等解决方案。联系方式:李静15501226544 tensorflow虽是深度学习领域最广泛使用的框架,但是对比pytorch这一动态图框架,采用静态图(graph模式)的tensorflow确实是难用。好在最近tensorflow支持了eager模式,对标pytorch的动态执行机制。更进一步地,google在最近推出了全新的版本tensorflow 2.0,2.0版本相比1.0版本不是简单地更新,而是一次重大升级(虽然目前只发布了preview版本)。简单地来说,tensorflow 2.0默认采用eager执行模式,而且重整了很多混乱的模块。毫无疑问,2.0版本将会逐渐替换1.0版本,所以很有必要趁早入手tensorflow 2.0。这篇文章将简明扼要地介绍tensorflow 2.0,以求快速入门。 章节目录
 
eager执行
autograph
性能优化:tf.function eager执行
tensorflow的eager执行时一种命令式编程(imperative programming),这和原生python是一致的,当你执行某个操作时是立即返回结果的。而tensorflow一直是采用graph模式,即先构建一个计算图,然后需要开启session,喂进实际的数据才真正执行得到结果。显然,eager执行更简洁,我们可以更容易debug自己的代码,这也是为什么pytorch更简单好用的原因。一个简单的例子如下: 1.x = tf.ones((2, 2), dtype=tf.dtypes.float32)2.y = tf.constant([[1, 2],3. [3, 4]], dtype=tf.dtypes.float32)4.z = tf.matmul(x, y)5.print(z)6.# tf.tensor(7.# [[4. 6.]8.# [4. 6.]], shape=(2, 2), dtype=float32)9.print(z.numpy())10.# [[4. 6.]11.# [4. 6.]]
可以看到在eager执行下,每个操作后的返回值是tf.tensor,其包含具体值,不再像graph模式下那样只是一个计算图节点的符号句柄。由于可以立即看到结果,这非常有助于程序debug。更进一步地,调用tf.tensor.numpy()方法可以获得tensor所对应的numpy数组。
这种eager执行的另外一个好处是可以使用python原生功能,比如下面的条件判断:
                 
这种动态控制流主要得益于eager执行得到tensor可以取出numpy值,这避免了使用graph模式下的tf.cond和tf.while等算子。
另外一个重要的问题,在egaer模式下如何计算梯度。在graph模式时,我们在构建模型前向图时,同时也会构建梯度图,这样实际喂数据执行时可以很方便计算梯度。但是eager执行是动态的,这就需要每一次执行都要记录这些操作以计算梯度,这是通过tf.gradienttape来追踪所执行的操作以计算梯度,下面是一个计算实例:          
对于eager执行,每个tape会记录当前所执行的操作,这个tape只对当前计算有效,并计算相应的梯度。pytorch也是动态图模式,但是与tensorflow不同,它是每个需要计算tensor会拥有grad_fn以追踪历史操作的梯度。
tensorflow 2.0引入的eager提高了代码的简洁性,而且更容易debug。但是对于性能来说,eager执行相比graph模式会有一定的损失。这不难理解,毕竟原生的graph模式是先构建好静态图,然后才真正执行。这对于在分布式训练、性能优化和生产部署方面具有优势。但是好在,tensorflow 2.0引入了tf.function和autograph来缩小eager执行和graph模式的性能差距,其核心是将一系列的python语法转化为高性能的graph操作。
 
autograph
autograph在tensorflow 1.x已经推出,主要是可以将一些常用的python代码转化为tensorflow支持的graph代码。一个典型的例子是在tensorflow中我们必须使用tf.while和tf.cond等复杂的算子来实现动态流程控制,但是现在我们可以使用python原生的for和if等语法写代码,然后采用autograph转化为tensorflow所支持的代码,如下面的例子:
                       
上面我们定义了一个square_if_positive函数,它内部使用的python的原生的if语法,对于tensorflow 2.0的eager执行,这是没有问题的。然而这是tensorflow 1.x所不支持的,但是使用autograph可以将这个函数转为graph函数,你可以将其看成一个常规tensorflow op,其可以在graph模式下运行(tf2 没有session,这是tf1.x的特性,想使用tf1.x的话需要调用tf.compat.v1)。大家要注意eager模式和graph模式的差异,尽管结果是一样的,但是graph模式更高效。 
从本质上讲,autograph是将python代码转为tensorflow原生的代码,我们可以进一步看到转化后的代码:
           
可以看到autograph转化的代码定义了两个条件函数,然后调用if_stmt op,应该就是类似tf.cond的op。
autograph支持很多python特性,比如循环: 
           
对于大部分python特性autograph是支持的,但是其仍然有限制,具体可以见capabilities and limitations。
链接:
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/autograph/limitations.md
此外,要注意的一点是,经过autograph转换的新函数是可以eager模式下执行的,但是性能却并不会比转换前的高,你可以对比:
           
从结果上看,graph模式下的执行效率是最高的,原来的代码在eager模式下效率次之,经autograph转换后的代码效率最低。
所以,在tensorflow 2.0,我们一般不会直接使用tf.autograph,因为eager执行下效率没有提升。要真正达到graph模式下的效率,要依赖tf.function这个更强大的利器。
 

lj0320664712
越秀区起重吊装作业,服务价格合理的是哪家呢?
想放哪盆盆栽在卧室?测一测婚后你会有婆媳矛盾吗?
曳引机生产线经验丰富永磁同步曳引机装配线厂家定做
格兰特智能晾衣架加盟怎么样?格兰特智能晾衣架加盟好不好?
陕西全棉金缕蓄能被销售 全棉金缕蓄能被批发
TensorFlow 2.0入门指南(一)
2019年4月中国众筹行业月报:股权众筹融资额约2121万元
东风农场污水处理非离子聚丙烯酰胺加速沉淀,过滤
大同柴油发电机组回收行情价格
专业供应 潜水料护手套 运动健身手套 防滑弹性保暖 多款可选
锡林郭勒特产奶食 锡林郭勒特产牛肉干,舌尖上的锡盟草原
VMAX电动车 代驾专用电动车 折叠自行车
VOITH福伊特顶部加液给皂器VT-8609A
想知道SK-UCC共享面膜吧加盟条件吗 戳这里
光明中学借读有哪些政策-晋元中学借读积分有要求吗
大型超市换季下架品牌男装批发一手货源
履带吊风速仪
供应汽车服务连锁店增设皮鞋美容机
易高)六面湿膜测厚仪/梳规 可开发票
排水沟预制构件U型产品