日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习基于skcilearn tensorflow电子书_Tensorflow机器学习模型的跨平台上线 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本篇文章轉(zhuǎn)載自博客園,作者: 劉建平Pinard

在用PMML實(shí)現(xiàn)機(jī)器學(xué)習(xí)模型的跨平臺(tái)上線中,我們討論了使用PMML文件來實(shí)現(xiàn)跨平臺(tái)模型上線的方法,這個(gè)方法當(dāng)然也適用于tensorflow生成的模型,但是由于tensorflow模型往往較大,使用無法優(yōu)化的PMML文件大多數(shù)時(shí)候很笨拙,因此本文我們專門討論下tensorflow機(jī)器學(xué)習(xí)模型的跨平臺(tái)上線的方法。

一、tensorflow模型的跨平臺(tái)上線的備選方案

tensorflow模型的跨平臺(tái)上線的備選方案一般有三種:即PMML方式,tensorflow serving方式,以及跨語言API方式。PMML方式的主要思路在上一篇以及講過。這里唯一的區(qū)別是轉(zhuǎn)化生成PMML文件需要用一個(gè)Java庫jpmml-tensorflow來完成,生成PMML文件后,跨語言加載模型和其他PMML模型文件基本類似。

tensorflow serving是tensorflow 官方推薦的模型上線預(yù)測方式,它需要一個(gè)專門的tensorflow服務(wù)器,用來提供預(yù)測的API服務(wù)。如果你的模型和對應(yīng)的應(yīng)用是比較大規(guī)模的,那么使用tensorflow serving是比較好的使用方式。但是它也有一個(gè)缺點(diǎn),就是比較笨重,如果你要使用tensorflow serving,那么需要自己搭建serving集群并維護(hù)這個(gè)集群。所以為了一個(gè)小的應(yīng)用去做這個(gè)工作,有時(shí)候會(huì)覺得麻煩。

跨語言API方式是本文要討論的方式,它會(huì)用tensorflow自己的Python API生成模型文件,然后用tensorflow的客戶端庫比如Java或C++庫來做模型的在線預(yù)測。下面我們會(huì)給一個(gè)生成生成模型文件并用tensorflow Java API來做在線預(yù)測的例子。

二、訓(xùn)練模型并生成模型文件

我們這里給一個(gè)簡單的邏輯回歸并生成邏輯回歸tensorflow模型文件的例子。完整代碼參見我的github:https://github.com/ljpzzz/machinelearning/blob/master/model-in-product/tensorflow-java

首先,我們生成了一個(gè)6特征,3分類輸出的4000個(gè)樣本數(shù)據(jù)。

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)

接著我們構(gòu)建tensorflow的數(shù)據(jù)流圖,這里要注意里面的兩個(gè)名字,第一個(gè)是輸入x的名字input,第二個(gè)是輸出prediction_labels的名字output,這里的這兩個(gè)名字可以自己取,但是后面會(huì)用到,所以要保持一致。

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()

接著就是訓(xùn)練模型了,代碼比較簡單,畢竟只是一個(gè)演示:

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 ("優(yōu)化完畢!")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)

打印輸出我這里就不寫了,大家可以自己去試一試。接著就是關(guān)鍵的一步,存模型文件了,注意要用convert_variables_to_constants這個(gè)API來保存模型,否則模型參數(shù)不會(huì)隨著模型圖一起存下來。

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已經(jīng)被保存下來了,下面就是要跨平臺(tái)上線了。 

三、模型文件在Java平臺(tái)上線

這里我們以Java平臺(tái)的模型上線為例,C++的API上線我沒有用過,這里就不寫了。我們需要引入tensorflow的java庫到我們工程的maven或者gradle文件。這里給出maven的依賴如下,版本可以根據(jù)實(shí)際情況選擇一個(gè)較新的版本。

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

接著就是代碼了,這個(gè)代碼會(huì)比JPMML的要簡單,我給出了4個(gè)測試樣本的預(yù)測例子如下,一定要注意的是里面的input和output要和訓(xùn)練模型的時(shí)候?qū)?yīng)的節(jié)點(diǎn)名字一致。

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); }}

我的預(yù)測輸出是1,1,0,0,供大家參考。

四、一點(diǎn)小結(jié)

對于tensorflow來說,模型上線一般選擇tensorflow serving或者client API庫來上線,前者適合于較大的模型和應(yīng)用場景,后者則適合中小型的模型和應(yīng)用場景。因此算法工程師使用在產(chǎn)品之前需要做好選擇和評估。

往期精彩:

深度學(xué)習(xí)多種模型評估指標(biāo)介紹 - 附sklearn實(shí)現(xiàn)

干貨 | Attention注意力機(jī)制超全綜述

Tensorflow常用函數(shù)使用說明及實(shí)例簡記

機(jī)器學(xué)習(xí)中優(yōu)化相關(guān)理論知識簡述

自己動(dòng)手實(shí)現(xiàn)一個(gè)神經(jīng)網(wǎng)絡(luò)多分類器

Transformer 模型的 PyTorch 實(shí)現(xiàn)

干貨 | NLP中的十個(gè)預(yù)訓(xùn)練模型

干貨|一文弄懂機(jī)器學(xué)習(xí)中偏差和方差

FastText原理和文本分類實(shí)戰(zhàn),看這一篇就夠了

Transformer模型細(xì)節(jié)理解及Tensorflow實(shí)現(xiàn)

GPT,GPT2,Bert,Transformer-XL,XLNet論文閱讀速遞

機(jī)器學(xué)習(xí)算法篇:最大似然估計(jì)證明最小二乘法合理性

Word2vec, Fasttext, Glove, Elmo, Bert, Flair訓(xùn)練詞向量教程+數(shù)據(jù)+源碼

別偷偷摸摸的在看,有用就點(diǎn)個(gè)好看呀?

總結(jié)

以上是生活随笔為你收集整理的机器学习基于skcilearn tensorflow电子书_Tensorflow机器学习模型的跨平台上线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。