Это будет вторая часть этой серии, ранее я опубликовал первую часть с очень простым способом создания модели. Это будет немного больше с реальными данными с множеством функций и некоторыми преобразованиями в наборе данных.

Набор данных, который я буду использовать, будет набором данных с открытым исходным кодом из набора данных 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]
}]