Один из наиболее часто задаваемых вопросов в репозитории Stackoverflow или Github на Keras - это преобразование модели. Для быстрого тестирования и доступности предварительно обученной модели для классификаторов изображений большинство разработчиков / исследователей обычно используют Keras. Модели классификаторов изображений, такие как VGG16 / 19, Inception, Resnet и т. Д., Легко загрузить с помощью библиотеки Keras. В большинстве случаев эти модели используются в качестве базовой архитектуры. В задачах компьютерного зрения, таких как локализация и сегментация изображений (Mask RCNN), в качестве базовой архитектуры используется модель классификатора изображений.
Модель классификатора изображений из Keras может быть сохранена только в формате h5, родном для формата модели Keras. Однако, когда эта модель должна использоваться для вывода, она должна быть в формате прото-буфера [примечание * модель h5 может обслуживаться с помощью flask].
Давайте сразу погрузимся в код. Импортируйте модули Keras, которые могут загружать модель Keras (Начало).
import keras import json import os import sys import tensorflow as tf from keras.applications.inception_v3 import InceptionV3 from keras.layers import Input
Давайте создадим каталог для сохранения модели в формате Keras, чтобы позже мы импортировали модель h5. Это проиллюстрирует способ сохранения модели и загрузки модели в Keras.
base_path = "/tmp/tfmodeldir/kerasmodel" inception_model = InceptionV3(weights=’imagenet’, input_tensor=Input(shape=(299, 299, 3))) inception_model.save(os.path.join(base_path,’inception.h5'))
Вы можете перейти в каталог base_path, чтобы увидеть, была ли сохранена модель.
Теперь мы загрузим сохраненную модель в формате h5 с вашего диска и проверим сводку начальной модели (большая сеть, такая огромная сводка слоев).
model = tf.keras.models.load_model(os.path.join(base_path, ‘inception.h5’)) model.summary() Model: "inception_v3" __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_2 (InputLayer) [(None, 299, 299, 3) 0 __________________________________________________________________________________________________ conv2d_95 (Conv2D) (None, 149, 149, 32) 864 input_2[0][0] __________________________________________________________________________________________________ batch_normalization_95 (BatchNo (None, 149, 149, 32) 96 conv2d_95[0][0] . . . . . . . . . . . . . . . . . . . . avg_pool (GlobalAveragePooling2 (None, 2048) 0 mixed10[0][0] __________________________________________________________________________________________________ predictions (Dense) (None, 1000) 2049000 avg_pool[0][0] ================================================================================================== Total params: 23,851,784 Trainable params: 23,817,352 Non-trainable params: 34,432
Тем временем вы можете проверить, может ли загруженная модель делать прогноз на входном изображении.
from keras.applications.inception_v3 import decode_predictions image = load_img('/tmp/elephant.jpg', target_size=(224, 224)) image = img_to_array(image) image = image.reshape(1, image.shape[0], image.shape[1], image.shape[2]) image = preprocess_input(image) y_ = model.predict(image) label = decode_predictions(y_) print(label[0][0]) >>('n02504458', 'African_elephant', 0.71297616)
Модель Кераса дает предсказание «африканского слона» с достоверностью 71,298%.
tf.keras.backend.set_learning_phase(0) export_dir = os.path.join(‘/tmp/tfmodeldir/kerasmodel’, ‘1’) with tf.keras.backend.get_session() as sess: tf.saved_model.simple_save(sess, export_dir, inputs= {“keys”:model.input}, outputs= {t.name: t for t in model.outputs})
Чтобы преобразовать формат буфера прототипа модели Keras в TP (Pb), давайте создадим выходной путь с версией модели как «1», потому что обслуживающий Tensorflow ищет номер версии.
Мы можем проверить определение подписи сохраненной модели с помощью saved_model_cli.
$ saved_model_cli show --dir /tmp/tfmodeldir/kerasmodel/1/ --all signature_def[‘serving_default’]: The given SavedModel SignatureDef contains the following input(s): inputs[‘keys’] tensor_info: dtype: DT_FLOAT shape: (-1, 299, 299, 3) name: input_3_2:0 The given SavedModel SignatureDef contains the following output(s): outputs[‘predictions_4/Softmax:0’] tensor_info: dtype: DT_FLOAT shape: (-1, 1000) name: predictions_4/Softmax:0 Method name is: tensorflow/serving/predict
По умолчанию определение сигнатуры - «serv_default». Теперь мы можем использовать tensorflow_serving для обслуживания замороженной модели (модель inception_v3 pb).
Теперь мы можем написать клиентскую секцию, если обслуживание работает хорошо. В этом случае мы не можем просто использовать curl, в отличие от других разделов, которые мы могли использовать для вывода с сервера. Здесь нам требуется извлечение функции изображения, поэтому требуется использовать библиотеку для получения функции из изображения.
from keras.preprocessing.image import load_img from keras.preprocessing.image import img_to_array from keras.applications.vgg16 import preprocess_input from keras.applications.vgg16 import decode_predictions import requests image = load_img(‘/tmp/elephant.jpg’, target_size=(224, 224)) image = img_to_array(image) image = image.reshape(1, image.shape[0], image.shape[1], image.shape[2]) image = preprocess_input(image) endpoint = “http://localhost:8501/v1/models/inception:predict" headers = {“content-type”:”application-json”} instances = image.tolist() data = json.dumps({“signature_name”:”serving_default”,”instances”: instances}) response = requests.post(endpoint, data=data, headers=headers) prediction = json.loads(response.text)[‘predictions’] prediction[0].index(max(prediction[0])) >>916
Результатом является 916, мы можем импортировать классы / метки из начального словаря классов, чтобы увидеть, является ли имя метки (значение) для ключа 916 «Африканский слон», как в приведенном выше примере.