Google Development Days China 2018 近日在中国召开了。非常遗憾,小编因为不可抗性因素滞留在合肥,没办法去参加。但是小编的朋友有幸参加了会议,带来了关于 tensorlfow 的一手资料。这里跟随小编来关注 tensorflow 在生产环境下的最佳应用情况。
Google Brain 软件工程师冯亦菲为我们带来了题为“用 Tensorflow 高层 API 来进行模型原型设计、训练和生产投入”的精彩报告。
冯亦菲姐姐给我们讲了一些 tensorflwo 的新的 API 的变动,最重要的是提出了一些使用 tensorflow 的建议。
总结出来有六个方面,分别是:
用 Eager 模式搭建原型
用 Datasets 处理数据
用 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 属于上面提出的第二种方式,可以简化数据输入过程,而且能够提高数据的读入效率。
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 就可以轻松的实现。
如上图所示,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)面试题级答案(精选版)
非科班出身程序员:如何获取职业资源、进入好公司?
相信自己,没有做不到的,只有想不到的
在这里获得的不仅仅是技术!