背景
机器学习把 Python 的历史地位推向了一个小高峰,我们习惯于用 Python 去编写机器学习的代码,但是在实际工程中,业务方用 Java 的可能性会比较大,那么如何用 Java 调用 Python 写的已经训练好的机器学习模型呢。本文接下来后以代码的形式极简演示,基于 Tensorflow 训练好的分类模型,如何使用 Java 应用调用。
环境
很奇怪,对于这样的问题,网络上很少有正确的例子,或者说很少有基于 Tensorflow 高级分类器 DNNClassifier 导出的模型,用 Java 调用的例子,为了减少麻烦,如果要实验的情况下,请以下面环境为准。
- Python: 3.6
- Tensorflow: 1.10.0
- Java 工程中的 gradle 依赖:
compile 'org.tensorflow:tensorflow:1.10.0'
compile 'org.tensorflow:proto:1.10.0'
代码演示
Python 代码如下,以著名的 iris 代码为例,用 DNNClassifier 进行分类
#
# Created on: 2018/8/23.
# Author: Heng Xiangzhong
#
# May the code be with you!
#
import pandas as pd
import tensorflow as tf
CSV_COLUMN_NAMES = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']
data_train = pd.read_csv('./data/iris_training.csv', names=CSV_COLUMN_NAMES, header=0)
data_test = pd.read_csv('./data/iris_test.csv', names=CSV_COLUMN_NAMES, header=0)
#print(data_train.head())
x_train = data_train
y_train = data_train.pop('Species')
x_test = data_test
y_test = data_test.pop('Species')
feature_columns = []
for key in x_train.keys():
feature_columns.append(tf.feature_column.numeric_column(key=key))
classifier = tf.estimator.DNNClassifier(feature_columns=feature_columns, hidden_units=[10, 10], n_classes=3)
# 用来保存为 saved_model
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
serving_input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)
def train_func(x, y):
dataset = tf.data.Dataset.from_tensor_slices((dict(x), y))
dataset = dataset.shuffle(1000).repeat().batch(100)
return dataset
classifier.train(input_fn=lambda: train_func(x_train, y_train), steps=1000)
export_dir = classifier.export_sa