机器学习基于skcilearn tensorflow电子书_Tensorflow机器学习模型的跨平台上线

本篇文章转载自博客园,作者: 刘建平Pinard

在用PMML实现机器学习模型的跨平台上线中,我们讨论了使用PMML文件来实现跨平台模型上线的方法,这个方法当然也适用于tensorflow生成的模型,但是由于tensorflow模型往往较大,使用无法优化的PMML文件大多数时候很笨拙,因此本文我们专门讨论下tensorflow机器学习模型的跨平台上线的方法。

一、tensorflow模型的跨平台上线的备选方案

tensorflow模型的跨平台上线的备选方案一般有三种:即PMML方式,tensorflow serving方式,以及跨语言API方式。PMML方式的主要思路在上一篇以及讲过。这里唯一的区别是转化生成PMML文件需要用一个Java库jpmml-tensorflow来完成,生成PMML文件后,跨语言加载模型和其他PMML模型文件基本类似。

tensorflow serving是tensorflow 官方推荐的模型上线预测方式,它需要一个专门的tensorflow服务器,用来提供预测的API服务。如果你的模型和对应的应用是比较大规模的,那么使用tensorflow serving是比较好的使用方式。但是它也有一个缺点,就是比较笨重,如果你要使用tensorflow serving,那么需要自己搭建serving集群并维护这个集群。所以为了一个小的应用去做这个工作,有时候会觉得麻烦。

跨语言API方式是本文要讨论的方式,它会用tensorflow自己的Python API生成模型文件,然后用tensorflow的客户端库比如Java或C++库来做模型的在线预测。下面我们会给一个生成生成模型文件并用tensorflow Java API来做在线预测的例子。

二、训练模型并生成模型文件

我们这里给一个简单的逻辑回归并生成逻辑回归tensorflow模型文件的例子。完整代码参见我的github:https://github.com/ljpzzz/machinelearning/blob/master/model-in-product/tensorflow-java

首先,我们生成了一个6特征,3分类输出的4000个样本数据。

import numpy as npimport matplotlib.pyplot as plt%matplotlib inlinefrom sklearn.datasets.samples_generator import make_classificationimport tensorflow as tfX1, y1 = make_classification(n_samples=4000, n_features=6, n_redundant=0,                             n_clusters_per_class=1, n_classes=3)

接着我们构建tensorflow的数据流图,这里要注意里面的两个名字,第一个是输入x的名字input,第二个是输出prediction_labels的名字output,这里的这两个名字可以自己取,但是后面会用到,所以要保持一致。

learning_rate = 0.01training_epochs = 600batch_size = 100x = tf.placeholder(tf.float32, [None, 6],name='input') # 6 featuresy = tf.placeholder(tf.float32, [None, 3]) # 3 classesW = tf.Variable(tf.zeros([6, 3]))b = tf.Variable(tf.zeros([3]))# softmax回归pred = tf.nn.softmax(tf.matmul(x, W) + b, name="softmax") cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)prediction_labels = tf.argmax(pred, axis=1, name="output")init = tf.global_variables_initializer()

接着就是训练模型了,代码比较简单,毕竟只是一个演示:

sess = tf.Session()sess.run(init)y2 = tf.one_hot(y1, 3)y2 = sess.run(y2)for epoch in range(training_epochs):    _, c = sess.run([optimizer, cost], feed_dict={x: X1, y: y2})    if (epoch+1) % 10 == 0:        print ("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c))    print ("优化完毕!")correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y2, 1))accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))acc = sess.run(accuracy, feed_dict={x: X1, y: y2})print (acc)

打印输出我这里就不写了,大家可以自己去试一试。接着就是关键的一步,存模型文件了,注意要用convert_variables_to_constants这个API来保存模型,否则模型参数不会随着模型图一起存下来。

graph = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, ["output"])tf.train.write_graph(graph, '.', 'rf.pb', as_text=False)

至此,我们的模型文件rf.pb已经被保存下来了,下面就是要跨平台上线了。 

三、模型文件在Java平台上线

这里我们以Java平台的模型上线为例,C++的API上线我没有用过,这里就不写了。我们需要引入tensorflow的java库到我们工程的maven或者gradle文件。这里给出maven的依赖如下,版本可以根据实际情况选择一个较新的版本。

<dependency>    <groupId>org.tensorflowgroupId>    <artifactId>tensorflowartifactId>    <version>1.7.0version>dependency>

接着就是代码了,这个代码会比JPMML的要简单,我给出了4个测试样本的预测例子如下,一定要注意的是里面的input和output要和训练模型的时候对应的节点名字一致。

import org.tensorflow.*;import org.tensorflow.Graph;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Paths;/** * Created by 刘建平pinard on 2018/7/1. */public class TFjavaDemo {    public static void main(String args[]){        byte[] graphDef = loadTensorflowModel("D:/rf.pb");        float inputs[][] = new float[4][6];        for(int i = 0; i< 4; i++){            for(int j =0; j< 6;j++){                if(i<2) {                    inputs[i][j] = 2 * i - 5 * j - 6;                }                else{                    inputs[i][j] = 2 * i + 5 * j - 6;                }            }        }        Tensor input = covertArrayToTensor(inputs);        Graph g = new Graph();        g.importGraphDef(graphDef);        Session s = new Session(g);        Tensor result = s.runner().feed("input", input).fetch("output").run().get(0);        long[] rshape = result.shape();        int rs = (int) rshape[0];        long realResult[] = new long[rs];        result.copyTo(realResult);        for(long a: realResult ) {            System.out.println(a);        }    }    static private byte[] loadTensorflowModel(String path){        try {            return Files.readAllBytes(Paths.get(path));        } catch (IOException e) {            e.printStackTrace();        }        return null;    }    static private TensorcovertArrayToTensor(float inputs[][]){        return Tensors.create(inputs);    }}

我的预测输出是1,1,0,0,供大家参考。

四、一点小结

对于tensorflow来说,模型上线一般选择tensorflow serving或者client API库来上线,前者适合于较大的模型和应用场景,后者则适合中小型的模型和应用场景。因此算法工程师使用在产品之前需要做好选择和评估。

往期精彩:

深度学习多种模型评估指标介绍 - 附sklearn实现

干货 | Attention注意力机制超全综述

Tensorflow常用函数使用说明及实例简记

机器学习中优化相关理论知识简述

自己动手实现一个神经网络多分类器

Transformer 模型的 PyTorch 实现

干货 | NLP中的十个预训练模型

干货|一文弄懂机器学习中偏差和方差

FastText原理和文本分类实战,看这一篇就够了

Transformer模型细节理解及Tensorflow实现

GPT,GPT2,Bert,Transformer-XL,XLNet论文阅读速递

机器学习算法篇:最大似然估计证明最小二乘法合理性

Word2vec, Fasttext, Glove, Elmo, Bert, Flair训练词向量教程+数据+源码

59928ed1307bb47e1bdc17760a4c60a7.png

别偷偷摸摸的在看,有用就点个好看呀62c858bb98c6ee0edd2a3051fff1882b.png 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html5 observer api,基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作

MutationObserver介绍MutationObserver给开发者们提供了一种能在某个范围内的DOM树发生变化时作出适当反应的能力.该API设计用来替换掉在DOM3事件规范中引入的Mutation事件.Mutation Observer(变动观察器)是监视DOM变动的接口。当DOM对象树发生任何变动时&#xff0c;Mutation …

Maven(五)使用Nexus搭建Maven私服

文章装载于&#xff1a;http://blog.csdn.net/jun55xiu/article/details/39497089 Nexus介绍 Nexus是Maven仓库管理器&#xff0c;如果你使用Maven&#xff0c;你可以从Maven中央仓库下载所需要的构件&#xff08;artifact&#xff09;&#xff0c;但这通常不是一个好的做法&am…

计算机学测打多少字,速度测试,一分钟能打多少字?

六、速度测试——检验学习效果经过一段时间的练习&#xff0c;输入速度提高了不少吧&#xff0c;赶快来测试一下现在一分钟可以输入多少英文或汉字。金山打字通2010的“速度测试”功能不仅有基本的“屏幕对照”速度测试&#xff0c;还有“书本对照”测试及要求较高的“同声录入…

HDFS入门(1)

2015.07.12笔记 1.HDFS Distributed File System&#xff08;操作系统实现人机交互&#xff0c;最重要的功能是文件管理&#xff0c;使用文件管理系统&#xff0c;windows、Linux文件管理系统有共性&#xff1a;用户可创建文件/夹&#xff0c;删除&#xff0c;修改权限&#xf…

竞赛图 计算机网络 应用题,我校学子获2020年“中国高校计算机大赛-网络技术挑战赛”全国总决赛一等奖(图)...

近日&#xff0c;2020年“中国高校计算机大赛-网络技术挑战赛”全国总决赛在温州浙南科技城落下帷幕。我校计算机与信息安全学院陈俊彦、雷晓春老师指导的“智载车队”团队(成员&#xff1a;林楷浩、陈澳格、黄湖)在创业先锋C系列中获得全国一等奖&#xff0c;在创新创意A系列中…

建立远程桌面连接计算机无密码,win7远程桌面空密码的步骤_win7系统如何设置让远程桌面登录无需密码-win7之家...

在日常工作中&#xff0c;可能经常会使用到远程连接桌面功能&#xff0c;我们要远程桌面的话&#xff0c;通常是要输入密码才可以的&#xff0c;但是有些用户觉得麻烦&#xff0c;那么win7系统如何设置让远程桌面登录无需密码呢&#xff1f;带着大家的这个问题&#xff0c;本文…

tkinter如何lable重复显示到同一行中_如何创建包含 CAD 导入和选择的仿真 App

在使用 COMSOL 软件二次开发的过程中&#xff0c;你可能会遇到这样的问题&#xff1a;如何使用 App 开发器创建可以处理 CAD 导入并能让用户交互式选择边界条件的仿真 App&#xff1f;我需要了解编程吗&#xff1f;今天我们将为您介绍在 COMSOL 软件中创建包含 CAD 导入和选择的…

计算机科学导论课后单词,计算机科学导论课后总结

计算机科学导论课后总结1老师上课给我们演示了一个迷宫的程序&#xff0c;然后我上网查找了一下&#xff0c;大致学习了一下这个程序的思想。迷宫这个题目和数据结构—图有关迷宫的随机生成和路径搜索主要和图的遍历有关&#xff0c;一般来说图的遍历主要有两种方式&#xff1a…

表单内如何直接贴图而不用上传图片_表单如何添加图片?

表单其实就是我们平常经常看到的收集信息的框框&#xff0c;如姓名、电话等&#xff0c;当然易表单就远不止这些哦&#xff0c;还可制作调查问卷&#xff0c;报名登记、投票评选和考试测评。平时大家都擅长于制作表单的文字内容&#xff0c;实际上表单里边添加一些图片会让表单…

Android应用的安全的攻防之战

一、前言 在前两篇破解的文章中&#xff0c;我们介绍了如何使用动态调试来破解apk&#xff0c;一个是通过调试smali源码&#xff0c;一个是通过调试so代码来进行代码的跟踪破解&#xff0c;那么今天我们就这两篇文章的破解方法&#xff0c;来看看Android中开发应用的过程中如何…

标准正态分布表_表达矩阵的归一化和标准化,去除极端值,异常值

我们阅读量破万的综述&#xff1a;RNA-seq这十年(3万字长文综述)给粉丝朋友们带来了很多理解上的挑战&#xff0c;所以我们开辟专栏慢慢介绍其中的一些概念性的问题&#xff0c;上一期&#xff1a;RNA-seq的counts值&#xff0c;RPM, RPKM, FPKM, TPM 的异同在数据挖掘过程&…

计算机网络关于封装成帧题目,上海第二工业大学-计算机网络通信期中试卷答案...

上海第二工业大学 (试卷编号&#xff1a; )2014-2015学年第2学期 计算机网络与通信 期中考试试卷姓名&#xff1a; 学号&#xff1a; 班级&#xff1a; 成绩&#xff1a;一、 填空题 (每空1分&#xff0c;共18分)1. 当前广泛提及的三网融合中的三网分别是 电信网络 、 电视网络…

微星主板超频_内存超频能力依旧拔群!微星MEG Z490 ACE主板评测

一、前言&#xff1a;内存超频首选的新板子来了一直以来&#xff0c;微星主板都以强悍的内存超频能力而著称&#xff0c;而高频内存对于许多游戏带来的提升都是肉眼可见。随着全新Intel 10代酷睿处理器的上市&#xff0c;微星的MEG系列的Z490主板会给大家带来哪些惊喜呢&#x…

g++ 内存不够_手机内存老是不足?这三招,让你马上腾出12个G

不知道朋友们遇到手机卡慢、空间不足的第一反应是什么&#xff1f;A&#xff1a;换个手机。B&#xff1a;内存满了&#xff0c;找清理软件狂删啊&#xff01;使用智能手机的人大家肯定和小编一样恋旧&#xff0c;觉得换手机很麻烦所以不断尝试各种清理软件&#xff0c;清理手机…

stringbuilder寻找字符串位置可能存在多个 java_Java 语言基础amp;String

Java 语言基础String 字符串的不可变性 定义一个字符串使用变量来赋值变量 String s2 s; s2 保存了相同的引用值&#xff0c; 因为他们代表同一个对象 字符串连接 s s.concat("ef"); s 中保存的是一个重新创建出来的 string 对象的引用 总结一旦一个 str…

cogs 547:[HAOI2011] 防线修建

★★★☆ 输入文件&#xff1a;defense.in 输出文件&#xff1a;defense.out 简单对比                      时间限制&#xff1a;1 s 内存限制&#xff1a;128 MB 题目描述&#xff1a; 近来A国和B国的矛盾激化&#xff0c;为了预防不测&#…

人工智能和计算机软件,人工智能在计算机软件方面有什么应用?

人工智能(Artificial Intelligence) &#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支&#xff0c;它企图了解智能的实质&#xff0c;并生产出一种新的能以人类智能相似…

pq分解法中b’怎么求_14.初中数学:二元一次方程组,加减消元法怎么解?视频有详细解题步骤...

欢迎您来到方老师数学课堂&#xff0c;请点击上方蓝色字体&#xff0c;关注方老师数学课堂。所有的视频内容&#xff0c;全部免费&#xff0c;请大家放心关注&#xff0c;放心订阅。初中数学&#xff1a;二元一次方程组&#xff0c;加减消元法怎么解&#xff1f;视频有详细解题…

win8计算机可用内存不足,Win8.1玩游戏提示计算机内存不足,Win8.1内存不足怎么办?...

Win8.1玩游戏提示计算机内存不足,Win8.1内存不足怎么办?有朋友使用Win8.1系统&#xff0c;这一段时间&#xff0c;在玩游戏(如孤岛危机3、鬼泣4)过程中&#xff0c;频繁出现下面提示框&#xff1a;关闭程序以防止信息丢失计算机的内存不足。请保存文件并关闭这些程序Windows将…

css划上去变长,Css3如何实现鼠标移上变长特效?(图文+视频)

本篇文章主要给大家介绍用css3实现鼠标移入变长效果的方法。在前端页面设计中&#xff0c;css的功能是异常强大的&#xff0c;只要运用好它&#xff0c;你能实现很多网站各种精彩的动态效果。那么在之前的文章中也给大家分享介绍了一些用css实现动画效果的方法&#xff0c;比如…