当前位置: 首页 > Web前端 > HTML

谷歌开发者大会:你不得不知道的Tensorflow小技巧

时间:2023-04-02 21:09:11 HTML

GoogleDevelopmentDaysChina2018近日在中国举行。遗憾的是,小编因不可抗拒的因素滞留合肥,未能参加。不过小伙伴们有幸参加了会议,带来了关于tensorlfow的第一手资料。在这里跟随小编一起关注tensorflow在生产环境中的最佳应用。谷歌大脑软件工程师冯一飞为我们带来了题为《使用Tensorflow高级API进行模型原型制作、训练和生产投资》的精彩报告。冯一飞姐给我们讲了tensorflwo的一些API新变化,最重要的是提出了一些使用tensorflow的建议。总结了六个方面,分别是:使用Eager模式构建原型,使用Datasets处理数据,使用FeatureColumns提取特征,使用Keras构建模型,使用CannedEstimators与SavedModel打包模型,一起来看看吧依次在这六个方面。使用Eager模式构建原型作为计算机行业的一员,我们知道静态图形的效率自然是很快的,但是使用动态图形给我们带来了很多便利。2017年各大框架的动态图开始流行,于是Google提出了tf.contrib.eager来迎接挑战。使用Eager有什么好处?回想之前我们在调试tensorflow程序的时候不得不使用sess.run(),非常麻烦,但是使用Eager可以直接打印出变量,极大的方便了我们的调试;好处不止这么多,在模型构建的时候,我们之前不得不仔细考虑Tensor的形状,一旦出错也不容易定位。使用Eager,可以搭建网络结构并打印出形状来确认是否正确。这使我们更容易建立网络;另外,使用Eager后,自定义Operation和Gradient会方便很多。这是一个简单的例子。首先使用pipinstalltf-nightly安装Eager(或pipinstalltf-nightly-gpu用于GPU版本)。importtensorflowastfimporttensorflow.contrib.eagerastfetfe.enable_eager_execution()#启用Eager模式a=tf.constant([5],dtype=tf.int32)foriinrange(a):print(i)使用Eager后我们可以很顺利的执行上面的代码。但是如果没有Eager,就会报Tensor对象不能被解释为整数的错误。缺点方面,引入Eager势必会产生额外的成本。ProcessingdatawithDatasets读取tensorflow数据的方式有3种:通过feeding;通过管道;直接读取保存在变量或常量中的数据。Datasets属于上面提出的第二种方法,可以简化数据输入过程,提高数据读取效率。Datasets的组成如上所示。其中:Dataset:创建和转换数据集的基础;TextLineDataset:从文本文件中读取行;TFRecordDataset:读取TFRecord文件;FixedLengthRecordDataset:从二进制文件中读取固定大小的记录;迭代器:提供了一种一次访问一个数据的方法来设置元素。对于Datasets的使用,我们可以使用Dataset的子类提供的方法,也可以直接使用基类的方法:tf.data.Dataset.from_tensors()或tf.data.Dataset.from_tensor_slices()。使用特征列提取特征特征列实际上是一种数据结构,一种用来描述特征的数据结构。使用特征列可以在输入训练模型之前轻松处理特征。比如对于鸢尾花的识别,对于输入数据,每一列代表不同的特征,比如花瓣的长度,萼片的长度等,我们要处理不同的列(或者所有列),使用FeatureColumns可以很容易地实现。如上图所示,FeatureColumns形成了对输入数据集的结构描述。方便我们对每一列数据进行处理,也让代码的可读性更强。要用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中定义的模型就更简单了简单一个字,极其方便。借用CannedEstimatorsEstimatorsAPI提供了模型选择、评估、训练等一系列功能。在1.3版本之后,Google添加了另一层,称为CannedEstimators。创建深度模型只需要一行代码。估算器可以与上面提到的特征列结合使用。tf.estimator.Estimator是基类;Pre-madeEstimators是基类的子类,是我们可以直接使用的定义好的模型;CustomEstimators是基类的实际列,没有定义,需要我们自己实现模型的定义。对于这里的模型来说,它由三部分组成:Inputfunction:输入函数,也就是我们前面提到的Datasets,用来表示数据;模型功能:实验模型的训练、验证、测试和监控模型参数;Estimators:控制数据流和模型的各种操作。与tensorflow原有的tf.train.Saver来保存模型相比,SavedModel提供了一种更好的将模型部署到生产环境的方式,更适合商业用途。如上图右下部分所示,使用SavedModel打包模型时,可以生成两个模型:对应第一个模型,TensorflowModelAnalysis可以方便我们分析模型,是否存在参数问题,或者模型设计的地方不合适等;经过分析,我们觉得模型不错,可以通过TensorflowServing进行部署。此外,与Saver的方法相比,我们在推理时不需要重新定义Graph(模型)。如果使用Saver,使用模型时需要重新定义模型。如果是一个程序员设计和使用的嘛,要是别的猿用这个模型,不知道这个模型的张量就尴尬了。所以使用SavedModel可以让我们更方便的使用模型。总结GoogleDeveloperDays给我们提供了一场盛宴,希望和大家一起学习知识。如果可以,请喜欢这篇文章。据说喜欢的可以进google。阅读更多react-native技术的优缺点一种方法教你理解JVM和Dalvik的区别专业背景的程序员:如何获得职业资源,进入好的公司?相信自己,没有做不到的,只有想不到,在这里你能得到的不仅仅是技术!