Google开发者大会:你不得不知的Tensorflow小技巧

Google Development Days China 2018近日在中国召开了。很是遗憾,小编由于不可抗性因素滞留在合肥,没办法去参加。可是小编的朋友有幸参加了会议,带来了关于tensorlfow的一手资料。这里跟随小编来关注tensorflow在生产环境下的最佳应用状况。react

Google Brain软件工程师冯亦菲为咱们带来了题为“用Tensorflow高层API来进行模型原型设计、训练和生产投入”的精彩报告。程序员

image

冯亦菲姐姐给咱们讲了一些tensorflwo的新的API的变更,最重要的是提出了一些使用tensorflow的建议。面试

image

总结出来有六个方面,分别是:
  • 用Eager模式搭建原型react-native

  • 用Datasets处理数据bash

  • 用Feature Columns提取特征网络

  • 用Keras搭建模型数据结构

  • 借用Canned Estimators框架

  • 用SavedModel打包模型函数

下面咱们依次来了解下这六个方面。学习

用Eager模式搭建原型

做为计算机界的一份子,咱们知道静态图的效率天然是快快的,可是动态图的使用为咱们的使用带来的不少方便。17年的时候,各大框架动态图大行其道,因而Google提出了tf.contrib.eager应对挑战。

使用Eager有什么好处呢?回想以前咱们在调试tensorflow的程序时,不得不使用sess.run(),麻烦的要死,而使用Eager就能够直接的将变量打印出来,大大方便了咱们的调试;好处不止这么多,在进行模型搭建的时候,之前咱们须要仔细考虑下Tensor的shape,一旦出错要定位也很不容易。而使用Eager能够一边搭建网络结构,一边将shape打印出来确认下是否正确。这就使咱们在搭建网络时更加方面快捷了;此外,使用Eager后,自定义Operation和Gradient也会方便不少。

下面举个简单的小例子。首先使用pip install tf-nightly(或GPU版本pip install tf-nightly-gpu)来安装Eager。

import tensorflow as tfimport tensorflow.contrib.eager as tfetfe.enable_eager_execution() #开启Eager模式a = tf.constant([5], dtype=tf.int32)for i in range(a):   print (i)
复制代码

使用Eager后咱们能够很顺利的执行上述代码。可是若是没有Eager,就会报Tensor对象不能解释为integer的错误。从缺点上来说,Eager的引入也势必形成额外的成本。

用Datasets处理数据

tensorflow的数据读入有三种方式:经过feeding的方式;经过管道(pipeline)的方式;直接读取变量或常量中保存的数据。Datasets属于上面提出的第二种方式,能够简化数据输入过程,并且可以提升数据的读入效率。

image

Datasets的组成如上如所示。其中:

  • Dataset:建立和转换数据集的基本;

  • TextLineDataset:从文本文件中读取行;

  • TFRecordDataset:读取TFRecord文件;

  • FixedLengthRecordDataset:从二进制文件读取固定大小的记录;

  • Iterator:提供一种一次访问一个数据集元素的方法。

对于Datasets的使用,咱们可使用Dataset的子类提供的方法,也能够直接使用基类的方法:tf.data.Dataset.from_tensors()或者tf.data.Dataset.from_tensor_slices()。

用Feature Columns提取特征

Feature Columns其实是一个数据结构,一个用于描述特征的数据结构。利用Feature Columns能够很方便的对输入训练模型前的特征进行处理。好比鸢尾花的识别,对于输入数据,每列表示不一样的特征,如花瓣的长度,花萼的长度等等,咱们想要对不一样的列分别进行处理(或者对全部的列进行处理),使用Feature Columns就能够轻松的实现。

image

如上图所示,Feature Columns造成了对输入数据集的结构性描述。能够方便咱们对每列数据进行处理,并且使得代码的可读性更强。

用Keras搭建模型

想必你们对Keras已经比较了解了,使用Keras来构建一个神经网络,简直是飞通常地速度,并且完美的兼容tensorflow。

simple_model=Sequential()simple_model.add(Dense(3,input_shape=(x.shape[1],),activation='relu',name='layer1'))simple_model.add(Dense(5,activation='relu',name='layer2'))simple_model.add(Dense(1,activation='sigmoid',name='layer3'))
复制代码

构建一个模型就是如上面这么简单,并且调用API中定义好的模型更是只须要一句话,极其的方便。

借用Canned Estimators

Estimators API提供了模型选择、评估、训练等一些列功能。在1.3版本后,Google又增长了一层,称之为Canned Estimators。只须要一行代码就可以建立深度模型。Estimators能够结合上面提到的Feature Columns一块儿使用。

tf.estimator.Estimator是基类;Pre-made Estimators是基类的子类,是已经定义好的模型,咱们能够直接拿来使用;Custom Estimators是基类的实列,并非定义好的,须要咱们本身实现模型的定义。

对于这里的模型,由三部分组成:

  • Input function:输入函数,即咱们前面所说的Datasets,对于数据进行表示;

  • Model function: 实验模型的训练、验证、测试以及监控模型的参数;

  • Estimators: 控制数据流以及模型的各类运算。

用SavedModel打包模型

相比于tensorflow原版的tf.train.Saver保存模型的方式,SavedModel提供了更好的将模型部署到生成环境的手段,更适用于商业目的。

如上图右下方部分,在使用SavedModel打包模型时,能够产生两种模型:

对应于第一种模型,Tensorflow Model Analysis能够方便咱们对模型进行分析,是否是存在参数的问题,抑或是模型哪里设计的不合适等等;经过分析后,感受模型不错,咱们就能够经过Tensorflow Serving进行部署。

此外,相比于Saver的方式,咱们在inference时不须要再从新定义Graph(模型),若是使用Saver的话,在使用该模型时就须要再定义该模型,若是是一个程序猿设计并使用的还好,若是换成另外一个猿去用这个模型,他又不知道模型的tensor的状况,那就尴尬了。因此使用SavedModel可让咱们更轻松地去使用模型。

总结

Google Developer Days给咱们提供了一场盛宴,但愿和你们一块儿学习其中的知识。若是能够,请为这篇文章点个赞吧。听说点赞的都能进Google。

阅读更多

react-native技术的优劣

 一招教你读懂JVM和Dalvik之间的区别

NDK项目实战—高仿360手机助手之卸载监听

(Android)面试题级答案(精选版)

非科班出身程序员:如何获取职业资源、进入好公司?

相信本身,没有作不到的,只有想不到的

在这里得到的不只仅是技术!

相关文章
相关标签/搜索