首页 >> 大全

【转载】史上最全:TensorFlow 好玩的技术、应用和你不知道的黑科技

2023-06-22 大全 46 作者:考证青年

【导读】 在 2015 年年底一出现就受到了极大的关注,经过一年多的发展,已经成为了在机器学习、深度学习项目中最受欢迎的框架之一。自发布以来, 不断在完善并增加新功能,直到在这次大会上发布了稳定版本的 V1.0。这次是谷歌第一次举办的开发者和爱好者大会,我们从主题演讲、有趣应用、技术生态、移动端和嵌入式应用多方面总结这次大会上的,希望能对开发者有所帮助。

:面向大众的机器学习框架

过去获得成绩主要有以下几点:

第一代分布式机器学习框架不再满足内部的需求,的小伙伴们在基础上做了重新设计,引入各种计算设备的支持包括CPU/GPU/TPU,以及能够很好地运行在移动端,如安卓设备、ios、树莓派等等,支持多种不同的语言(因为各种high-level的api,训练仅支持,支持包括C++,Go,Java等等),另外包括像这类很棒的工具,能够有效地提高深度学习研究工作者的效率。

在内部项目应用的增长也十分迅速:在多个产品都有应用如:Gmail, Play , , , Map等等;有将近100多和paper使用做相关工作。

在过去14个月的开源的时间内也获得了很多的成绩,包括475+非的,14000+次,超过5500标题中出现过的 以及在Stack 上有包括5000+个已被回答的问题,平均每周80+的issue提交。

过去1年,从最开始的0.5,差不多一个半月一个版本:

1.0的发布

.0也发布了,虽然改了好多api,但是也提供了.py来对你的代码进行更新。 1.0在分布式训练-v3模型上,64张GPU可以达到58X的加速比,更灵活的高层抽象接口,以及更稳定的API。

New High Level API

对于新的抽象接口,相对于其他 做的比较好,能让人很容易build一个model,基于layer之上的包括TF.Learn里面仿照-learn风格的各种设计以及之后将融入官方支持的Keras,能够让小伙伴用几行配置模型结构、运行方式、模型输出等等;在这层之上就有 ,所谓的model in box,比如lr,这类。

Broad ML

在中有一些高兴的机器学习的算法实现,如LR, SVM、 ,在TF.Learn中有很多常用的机器学习算法的实现,用户可以很快的使用,而且API风格和-learn很类似,而且在后续的video提到会有分布式的支持。

XLA: An

XLA能够快速地将转成比较底层的实现(依赖),后面也有talk详细讲述了XLA。

广泛的合作

In Depth

在和上有很好的优势,如下图:

在模型训练上,1机8卡的性能无论是在一些标准的基准测试或者是真实数据上都有比较好的加速比:

当然在多机分布式训练上,能够达到64张GPU上58倍的加速比:

被一些顶尖的学术研究项目使用:

当然在生产上也被广泛应用:

如 ,Gmail等等,也被国内外很多大厂使用做为模型训练的工具。

这些都是Jeff Dean在的内容讲到的内容,内容有点多,而且个人感觉这群的小伙伴的ppt做的有点任性,不过谁叫他们牛逼呢,接下来几个talk比较有技术含量,相信各位会更加有兴趣。

有趣的应用案例

皮肤癌图像分类

首先我们说下两个数据:1. 医疗机构统计皮肤癌在早期的治愈率是98%;2. 在2020,预计全球有61亿台智能手机。

这位小哥做的工作是啥呢,他拿到了一批皮肤癌的数据,然后使用一个的-v3对数据来做一个:

最终结果:

而且在手机上很容易搭建,完成一个app用来做早起皮肤癌的检测:

最终相关成果发表在,而且在的封面,这是一个特别成功地通过计算机视觉及深度学习相关的技术,利用廉价的移动设备,能够很有效地检测是否有皮肤癌,大大节省了医疗检测的成本,相信在未来会有更多相关的技术出现。

利用AI预测糖尿病,预防失明

这个talk讲的前面也提到的通过视网膜图像预测糖尿病,预防失明:

通过视网膜图片预测糖尿病是一个困难的问题,即使是专业的医生,也很难去判断,但是深度学习却可以帮助我们:

通过收集适量的医疗数据,构建一个的深度卷积网络,我们可以让网络自动学习这些图像中的,来获得较高的分类准确率,而这个是人眼很难解决的。

这里有一个demo的演示:

模型最后的评估比专业医生对比,F-score为0.95,比专业医生的中位数0.91还高,这个太厉害了,相信不久会看到深度学习在医疗,尤其是这种病症图像分析上有很多惊人的成果。

Wide & Deep In Play

这项技术有段时间特别火,被用来做推荐相关的应用,首先解释下和:

模型的基本结构如下:

整个推荐会同事考虑到商品的相关性以及一些推理关系,例如老鹰会飞、麻雀会飞这类逻辑属于, 而说带翅膀的动物会飞这属于。

在具体的应用场景,如 Play的App推荐:

这里构建一个如下图的网络来进行训练(joint ):

为啥要joint ,而不是直接用deep和wide的来做呢?

这里做这个给出一个解释,因为wide和deep会相互影响,最后精确度会高,并且model会比较小:

而上面提到的Wide & Deep Model在下仅仅只需要10行代码来实现(突然想起了那个100美元画一条线的故事):

: 音乐和艺术生成

这个项目讲的是利用深度学习来做一些艺术相关的工作,项目地址:有一些很好玩的东西,如风格化,生成艺术家风格的音乐,利用深度学习模型模拟人类对艺术的想象力,创造出属于的艺术风格。

团队所做的一些开发工作

在被收购之后,也选择作为其深度学习相关研究的平台,然后做了很多很有意思的东西。

1. Data

这是在全世界各地若干个数据中心之一:

然后这群的小伙伴做了些什么事情呢?

的小伙伴利用强化学习,是的!你没有听错,应用在上的一种技术来做数据中心冷却设备的自动控制,并且效果十分显著:

2.

是下的一个强化学习的框架,基于的高级API实现,很稳定,只需要更改其中极少部分代码就可以完成新的实验,支持分布式训练,十分高效,并且训练好的模型可以通过 快速地部署到生产环境。

3.

这个相信不说,大家都知道的,第一次在围棋上打败人类,然后升级版的 连续60盘不败,原理不说了,网络上很多分析文章,贴两张图聊表敬意:

4. :语音音频合成

这里的小哥演示了的一些demo, 具体的可以参见()来了解。贴一些效果对比:

XLA 及 Keras 与 的融合

XLA与的结合

的各方面的优势都很突出,除了在速度这块有些不足,如果,能在速度上做进一步优化,会怎么样呢 ?

是的,的开发者也意识到这个问题,于是有了这个XLA, XLA的优势:

XLA主要包括两种使用方式:JIT(Just in time)能够自动将Graph中的部分子图通过XLA融合某些操作来减少内存需求提高执行速度;AOT(Ahead of time)可以提前将Graph转换为可以执行的源码,减少生成的可执行文件的大小,减少运行的时间消耗,一个很明显的应用场景是模型在移动设备上的优化。

因为XLA原理涉及到编译器,这块不是我擅长的地方,所以这里就这样过了, 如果有兴趣的小伙伴可以关注下()还有此次 上XLA的talk(#t=108.)

最后贴几张XLA的一些评测性能:

Keras与的集成

Keras 是一个可以在很多平台上应用的深度学习框架,"An API for deep many "。

已经会在官方支持,1.1会在tf.,1.2会tf.keras,而且会支持 ,是不是很心动。

Keras的作者在 Dev 上讲了以下内容:

所以之后Keras的用户可以更快的在的框架下做出相应地模型,能更方便地进行分布式训练,使用的Cloud ML, 进行超参,还有更更重要的:TF-。这些现在好像还没有支持,不过应该很快了,大家可以期待下。

这里, 使用Keras构造了一个Video-QA的model,这个模型在Keras的官方文档也有描述,具体可以去那边看看,大概是这样一个场景:

这样一个场景,利用原生的构造太难了,但是用Keras,只需要考虑设计你的模型,如何来完成类似的功能,完全不用担心的实现,如图是一个类似问题的一个简单地模型设计:

更详细一点:

而在Keras中如何实现呢?

video = tf.keras..Input(shape=(None, 150, 150, 3))cnn = tf.keras..(='', =False, pool='avg)cnn. = = tf.keras..(cnn)(video) = tf..LSTM(256)() = tf.keras..Input(shape=(100), dtype='int32')x = tf.keras..(10000, 256, =True)() = tf.keras..LSTM(128)(x)x = tf.keras..([, ])x = tf.keras..Dense(128, =tf.nn.relu)(x) = tf.keras..Dense(1000)(x)model = tf.keras..Mode([video, ], )pile(=tf.(), loss=tf.)

这里代码是无法在现在的版本上跑的,如果想了解下keras上构建上述模型的简便性,可以看看Keras的文档()。Keras在构造深度模型的方便是大家众所周知的,值得期待之后Keras在的更新:

High-Level APIs: in a Box

在灵活性、可扩展性、可维护性上做的很好,但是现在在高级api、模块式算法这块原先都还不足,但是 Brain的工程师在这个talk上介绍了一些High-level API的相关工作。

构造左图中所示的深度网络只需要如图右中的七行代码同样,构建训练、评估、预测也很快可以通过api调用完成:

最后是Model in a Box

area = ("")rooms = ("") = ("", ) = (=[area, room, ]).fit().()

其他技术及生态

ML

可能最开始被人知晓,就是因为大家都觉得他是一个深度学习的框架,其实不是,现在上还有很多机器学习的算法集成:

而且算法API的开发都是仿照-learn的风格,有下做机器学习的小伙伴,可以很快的适应。

这里值得提出的,有趣对机器学习和深度学习模型的支持,小伙伴们可以特别容易地结合传统的机器学习方法和深度学习模型来一起训练:

分布式

在分布式性能上,前面也提到了,在1.0版本上有了很大的提升可以做到64块GPU上达到58倍的加速,这里先基本介绍下数据并行和模型并行:

怎么在写分布式代码,这里我就不说了,很简单地配置,这里我讲下,可能大部分像我这样的小伙伴之前不太了解的一些彩蛋。在中做分布式训练的一些技巧,有过分布式train的经验应该会很感激这些黑科技:

上面说的是啥呢? 在保存模型的参数时,默认是每一个ps存一个,然后下一个到下个ps上存,但是就会存在很多问题,可能这个很小,但是另一个很大,这样你会发现ps和work之间的带宽的占用差距很多,怎么解决呢?看下面几张图。

说点题外话,为啥我在看到这里的时候特别激动呢,笔者之前在开展团队内部的分布式训练平台时就遇到这个问题,我们在测试模型时,发现多个ps上的带宽占用差别极大,原因在与模型的最后三个全连接参数太多,造成了ps的不均衡。

上面说了下 我特别激动的东西,之后talk的就是比较简单的了,如果在做分布式的job,文档里面都有,很简单,这里不提了不对,这里还必须说下对于容灾的一个支持。

下图是几种分布式下机器挂掉的情况:

多麻烦是吧,但是没有关系,在下能够自动对这些进行一个快速的恢复,只需要更改一行代码:

将模型布入生产环境

如何把训练好的模型快速部署在生产环境提供可用的服务, 就是专注在这块,我这里简单介绍下吧:

把训练好的模型提供生产环境可用的服务,通常有以下几个需求:

的设计就是为了解决这些需求,而且基于gRPC,支持多种语言。

生态

这部分讲了如果利用生态结合一些流程的框架比如Spark、等等来更好地使用。

1.数据准备工作

支持的数据读取方法,从快到慢依次是:

tf., tf.对象;

原生的读取CSV,JSON的OP;

直接从 feed数据(最简单)。

如何在其他如, Spark上支持(Beam原生支持) 见(//)

2. 集群的管理

支持以下多种框架:

3. 分布式存储

4. 容器支持

5. 模型导出

移动端以及嵌入式应用

and

Pete 介绍了怎么在移动设备比如安卓、IOS设备、树莓派上面怎么使用来做一些开发,具体的可能对移动设备程序开发的小伙伴们比较有用,有兴趣的可以去看看

Hands On

这个talk主要是介绍了的一些应用,很多用法以前都没有尝试过,听演讲者描述之后受益匪浅。

# a layer def (input, , ): w = tf。(tf。zeros([5, 5, , ])) b = tf。(tf。zeros([])) conv = tf。nn。(input, w, =[1, 1, 1, 1], ="SAME") act = tf。nn。relu(conv + b) act# And a fully layer def (input, , ): w = tf。(tf。zeros([, ])) b = tf。(tf。zeros([])) act = tf。nn。relu(tf。(input, w) + b) act# Setup , and the data x = tf。

(tf。, shape=[None, 784]) y = tf。(tf。, shape=[None, 10]) = tf。(x, [-1, 28, 28, 1])# the conv1 = (, 1, 32) pool1 = tf。nn。(conv1, ksize=[1, 2, 2, 1], =[1, 2, 2, 1], ="SAME")conv2 = (, 32, 64) pool2 = tf。nn。(conv2, ksize=[1, 2, 2, 1], =[1, 2, 2, 1], ="SAME") = tf。(pool2, [-1, 7 * 7 * 64])fc1 = (, 7 * 7 * 64, 1024) = (fc1, 1024, 10)# cross as our loss = tf。

( tf。nn。(=, =y))# Use an to train the = tf。train。(1e-4)。()# the = tf。equal(tf。(, 1), tf。(y, 1)) = tf。(tf。cast(, tf。))# all the sess。run(tf。())# Train for 2000 steps for i in range(2000): batch = mnist。train。(100)# if i % 500 == 0: [] = sess。

run([], ={x: batch[0], y: batch[1]}) print("step %d, %g" % (i, ))# Run the step sess。run(, ={x: batch[0], : batch[1]})

很多小伙伴都写过类似的代码,构造网络,然后设定训练方式,最后输出一些基本的结果信息,如下:

step 0, 10% step 500, 12% step 1500, 9% step 2000, 13%

给你的不仅仅是这些,有一个特别棒的工具能够可视化训练过程中的信息,能让人直观的感受,当然需要一些简单的配置:

写入Graph

= tf..("/tmp//1") .(sess.graph)

这里虽然能够可视化Graph,却感觉很杂乱,我们可以通过给一些node增加name,scope,让图变得更好看点:

def (input, , ,): with tf。(name): w = tf。(tf。zeros([5, 5, , ]),) b = tf。(tf。zeros([]),) conv = tf。nn。(input, w, =[1, 1, 1, 1], ="SAME") act = tf。nn。relu(conv + b) tf。nn。(act, ksize=[1, 2, 2, 1], =[1, 2, 2, 1], ="SAME")def (input, , ,): with tf。(name): w = tf。(tf。zeros([, ]),) b = tf。(tf。

zeros([]),) tf。nn。relu(tf。(input, w) + b)# Setup , and the data x = tf。(tf。, shape=[None, 784],) = tf。(x, [-1, 28, 28, 1]) y = tf。(tf。, shape=[None, 10],)conv1 = (, 1, 32, "conv1") conv2 = (conv1, 32, 64, "conv2") = tf。(conv2, [-1, 7 * 7 * 64]) fc1 = (, 7 * 7 * 64, 1024, "fc1") = (fc1, 1024, 10, "fc2")with tf。("xent"): xent = tf。

( tf。nn。(=, =y))with tf。("train"): = tf。train。(1e-4)。(xent)with tf。(""): = tf。equal(tf。(, 1), tf。(y, 1)) = tf。(tf。cast(, tf。)) = tf。。("/tmp//2") 。(sess。graph)

通过的api,收集更多的数据记录显示在中:

tf..('', xent) tf..('', )tf..image('input', , 3)

修改Conv的代码,将,bias,act加入到中:

def (input, , ,): with tf.(name): w = tf.(tf.zeros([5, 5, , ]),) b = tf.(tf.zeros([]),) conv = tf.nn.(input, w, =[1, 1, 1, 1], ="SAME") act = tf.nn.relu(conv + b) tf..("", w) tf..("", b) tf..("", act) tf.nn.(act, ksize=[1, 2, 2, 1], =[1, 2, 2, 1], ="SAME")

配置将训练过程中的数据写入:

= tf..() = tf..("/tmp//3") .(sess.graph)for i in range(2001): batch = mnist.train.(100) if i % 5 == 0: s = sess.run(, ={x: batch[0], y: batch[1]}) .(s, i) sess.run(, ={x: batch[0], y: batch[1]})

这次这个的talk给我最大的收获就是用做 是这么的方便, 这次talk中主要演示超参的两个方面:

# Try a few rates for in [1E-3, 1E-4, 1E-5]: # Try a model with fewer for in [True, False]: for in [True, False]: # a for each one (: "lr_1E-3,fc=2,conv=2) = (, , ) = tf..("/tmp//" + ) # run with the new mnist(, , , )

-- /tmp/

= tf.(tf.zeros([10000, ]),) = .() = tf.....() = ..add() . = .name .. = os.path.join(, '.png') # the width and of a . ...([28, 28]) tf.....(, )for i in range(2001): batch = mnist.train.(100) if i % 5 == 0: [, s] = sess.run([, summ], ={x: batch[0], y: batch[1]}) .(s, i) if i % 500 == 0: sess.run(, ={x: mnist.test., : mnist.test.}) saver.save(sess, os.path.join(, "model.ckpt"), i) sess.run(, ={x: batch[0], : batch[1]})

for

未来,会在以下三个方面来做一些提升:

总结

照例总结下,从上面不难看出在过去一年的时间里确实做了很多很有意思的工作,无论是在还是上,包括各种有意思的工具,其中收获最大的是利用来做超参的调节、还有Keras的新的支持、分布式的各种模型变量保存的优化方法、分布式容灾、XLA的支持是的模型更快,那么花在看这些演讲上的时间感觉没有浪费,但是因为个人知识有限,如上面有错误或者不周到的地方,欢迎指出,敬请谅解。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了