Это будет вторая часть этой серии, ранее я опубликовал первую часть с очень простым способом создания модели. Это будет немного больше с реальными данными с множеством функций и некоторыми преобразованиями в наборе данных.
Набор данных, который я буду использовать, будет набором данных с открытым исходным кодом из набора данных IRIS для классификации типов цветов (три категории цветов) на основе входных характеристик. Без лишних слов, давайте перейдем к коду.
Давайте импортируем несколько пакетов / заголовков python.
from sklearn import datasets from sklearn.model_selection import train_test_split import tensorflow as tf
В наборах данных из sklearn уже есть набор данных iris, поэтому мы можем просто загрузить набор данных, вызвав имя, однако мы также можем загрузить файл CSV с диска с помощью pandas.read_csv. Но в настоящее время мы сохраняем простоту. В другой серии мы загрузим данные из CSV и будем использовать преобразование Tensorflow для преобразования данных.
После загрузки данных мы можем разделить данные на обучающий набор и набор данных для оценки / тестирования. Кроме того, мы разделяем функции и метку. Затем мы создаем столбец функции с входным ключом функции как x, форма которого будет (4,).
INPUT_FEATURE = 'x' NUM_CLASSES = 3 iris = datasets.load_iris() X = iris.data y = iris.target index_list = range(len(y)) index_train, index_eval = train_test_split(index_list, train_size=0.8) X_train, X_eval = X[index_train], X[index_eval] y_train, y_eval = y[index_train], y[index_eval] feature_columns = [ tf.feature_column.numeric_column(INPUT_FEATURE, shape=[4]) ]
Теперь мы определяем конфигурацию с помощью API-интерфейса оценщика, как показано ниже.
training_config = tf.estimator.RunConfig( model_dir=’/tmp/iris/models/ckpt/’, save_summary_steps=100, save_checkpoints_steps=100)
Затем мы создаем DNNClassifier, используя API оценщика с именем DNNClassifier с параметрами со скрытыми единицами измерения, конфигурацией сверху, номерами классов и каталогом для сохранения модели контрольной точки.
classifier = tf.estimator.DNNClassifier( config=training_config, feature_columns=feature_columns, hidden_units=[10, 20, 10], n_classes=NUM_CLASSES, model_dir='/tmp/iris/models/ckpt/') train_spec = tf.estimator.TrainSpec( input_fn=train_input_fn, max_steps=10000)
Ниже этого конвейера мы будем использовать API-интерфейс оценщика для обучения и сохранения режима с функцией обучающего ввода и функцией ввода оценки. Вот почему API-интерфейс оценщика (API высокого уровня TensorFlow) оказался отличным инструментом.
def serving_input_receiver_fn(): receiver_tensors = { 'sepal_length': tf.placeholder(tf.float32, [None, 1]), 'sepal_width': tf.placeholder(tf.float32, [None, 1]), 'petal_length': tf.placeholder(tf.float32, [None, 1]), 'petal_width': tf.placeholder(tf.float32, [None, 1]), } features = { INPUT_FEATURE: tf.concat([ receiver_tensors['sepal_length'], receiver_tensors['sepal_width'], receiver_tensors['petal_length'], receiver_tensors['petal_width'] ], axis=1) } return tf.estimator.export.ServingInputReceiver(receiver_tensors=receiver_tensors, features=features) latest_exporter = tf.estimator.LatestExporter( name="models", serving_input_receiver_fn=serving_input_receiver_fn, exports_to_keep=10) best_exporter = tf.estimator.BestExporter( serving_input_receiver_fn=serving_input_receiver_fn, exports_to_keep=1) exporters = [latest_exporter, best_exporter] eval_input_fn = tf.estimator.inputs.numpy_input_fn( x={INPUT_FEATURE: X_eval}, y=y_eval, num_epochs=1, shuffle=False) eval_spec = tf.estimator.EvalSpec( input_fn=eval_input_fn, throttle_secs=180, steps=10, exporters=exporters)
Когда у нас есть все готовые ингредиенты, можно приступить к обучению и оценке, используя функцию оценки train_and_evaluate для выполнения обучения и оценки.
tf.estimator.train_and_evaluate(classifier, train_spec=train_spec, eval_spec=eval_spec)
После завершения обучения вы можете увидеть результат обучения с оценочными баллами. А также сохраненная модель в указанном каталоге
({'accuracy': 1.0, 'average_loss': 0.0020009247, 'loss': 0.060027737, 'global_step': 938}, [b'/tmp/iris/models/ckpt/export/models/1572589822', b'/tmp/iris/models/ckpt/export/best_exporter/1572589822'])
Это каталог сохраненной модели
Вы можете проверить подпись модели с помощью функции saved_model_cli в своем терминале, чтобы узнать входные и выходные параметры.
(myvenv) jugs@jugs:/tmp/iris$ saved_model_cli show --dir /tmp/iris/models/ckpt/export/models/157258982
Итак, теперь мы готовы обслуживать модель, используя TensorFlow для обслуживания / размещения модели для развертывания.
tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=iris --model_base_path=/tmp/iris/models/ckpt/export/models/
К настоящему времени наша модель находится в стадии развертывания и готова к работе с входящим клиентом. Итак, теперь мы можем создать клиентскую часть для вывода.
import json import requests import os import numpy as np endpoint = “http://localhost:8501/v1/models/iris:predict" headers = {“content-type”:”application-json”} instances = [{“sepal_length”:[6.8],”sepal_width”:[3.2],”petal_length”:[5.9],”petal_width”:[2.3]}] data = json.dumps({“signature_name”:”predict”,”instances”: instances}) response = requests.post(endpoint, data=data, headers=headers) prediction = json.loads(response.text)[‘predictions’] prediction
Все, что нам нужно, это результат прогнозирования на основе определения сигнатуры.
[{'class_ids': [2], 'classes': ['2'], 'all_class_ids': [0, 1, 2], 'all_classes': ['0', '1', '2'], 'probabilities': [2.90285893e-08, 0.00058580871, 0.999414206], 'logits': [-9.90864372, 0.00382383168, 7.445755] }]