Конвертировать модель TensorFlow в формат, который можно обслуживать - PullRequest
5 голосов
/ 18 июня 2019

Я слежу за документацией по обслуживанию Tensorflow, чтобы преобразовать мою обученную модель в формат, который можно подавать в контейнере Docker.Поскольку я новичок в Tensorflow, я изо всех сил пытаюсь преобразовать эту обученную модель в форму, которая будет подходящей для обслуживания.

Модель уже обучена, и у меня есть файл контрольных точек и файл .meta.Итак, мне нужно получить файл .pb и папку переменных из двух вышеупомянутых файлов.Может кто-нибудь предложить мне подход, как это сделать для обслуживания моделей?

.
|-- tensorflow model
|       -- 1
|       |-- saved_model.pb
|       -- variables
|           |-- variables.data-00000-of-00001
|           -- variables.index

Ответы [ 3 ]

1 голос
/ 19 июня 2019

От вашего вопроса, вы имеете в виду, что у вас больше нет доступа к модели, и у вас есть только Check Point files и .meta files?

В этом случае вы можете обратиться по ссылкам ниже, содержащим код для преобразования этих файлов в '.pb' file.

Tensorflow: Как преобразовать .meta, .dataи .index файлы моделей в один файл graph.pb

https://github.com/petewarden/tensorflow_makefile/blob/master/tensorflow/python/tools/freeze_graph.py

Если у вас есть доступ к Обученной модели, то, я полагаю, вы сохраняете ее в данный момент, используя tf.train.Saver,Вместо этого вы можете сохранить модель и экспортировать ее, используя любую из трех (обычно используемых) функций, указанных ниже:

  1. tf.saved_model.simple_save => В этом случае только API прогнозирования являетсяподдерживается во время обслуживания.Пример этого упоминается KrisR89 в его ответе.

  2. tf.saved_model.builder.SavedModelBuilder => В этом случае вы можете определить SignatureDefs, т. Е. API, к которым вы хотите обращаться во время обслуживания.Вы можете найти пример того, как его использовать, по ссылке ниже: https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/mnist_saved_model.py

  3. Третий способ показан ниже:

    classifier = tf.estimator.DNNClassifier (config = training_config,feature_columns = feature_columns, hidden_units = [256, 32], оптимизатор = tf.train.AdamOptimizer (1e-4), n_classes = NUM_CLASSES, выпадение = 0,1, model_dir = FLAGS.model_dir)

    classifier.export_savedmodel (FLAG.saved_dir,

    serve_input_receiver_fn = serve_input_receiver_fn)

Пример сохранения модели с использованием оценщиков можно найти по ссылке ниже.Это поддерживает API прогнозирования и классификации.

https://github.com/yu-iskw/tensorflow-serving-example/blob/master/python/train/mnist_premodeled_estimator.py

Дайте мне знать, если эта информация помогает или вам нужна дополнительная помощь.

1 голос
/ 18 июня 2019

Есть несколько способов сделать это, и другие методы могут потребоваться для более сложных моделей.В настоящее время я использую метод, описанный здесь , который прекрасно работает для моделей tf.keras.models.Model и tf.keras.Sequential (не уверен для подклассов тензорного потока?).

Ниже приведеноминимальный рабочий пример, в том числе создание модели с использованием python (кажется, что вы уже выполнили ее с помощью структуры папок и можете игнорировать первый шаг)

import tensorflow as tf
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
import tensorflow.keras.backend as K

inputs = Input(shape=(2,))
x = Dense(128, activation='relu')(inputs)
x = Dense(32, activation='relu')(x)
outputs = Dense(1)(x)

model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='adam', loss='mse')

# loading existing weights, model architectural must be the same as the existing model
#model.load_weights(".//MODEL_WEIGHT_PATH//WEIGHT.h5") 

export_path = 'SAVE_PATH//tensorflow_model//1'

with K.get_session() as sess:
    tf.saved_model.simple_save(
            sess,
            export_path,
            inputs={'inputs': model.input}, # for single input
            #inputs={t.name[:-5]: t for t in model.input}, # for multiple inputs
            outputs={'outputs': model.output})

Я предлагаю вместо этого использовать имя папки "tenensor_model"«тензор потока модели», чтобы избежать возможных проблем с пробелами.

Затем мы можем построить образ докера в терминале с помощью (для окон используйте ^ вместо \ для линейного тормоза и используйте // C / вместоC: \ in path):

docker run -p 8501:8501 --name tfserving_test \
  --mount type=bind,source="SAVE_PATH/tensorflow_model",target=/models/tensorflow_model \
  -e MODEL_NAME=tensorflow_model -t tensorflow/serving

Теперь контейнер должен быть запущен, и мы можем проверить обслуживание с помощью python

import requests
import json
#import numpy as np

payload = {
  "instances": [{'inputs': [1.,1.]}]
}

r = requests.post('http://localhost:8501/v1/models/tensorflow_model:predict', json=payload)
print(json.loads(r.content))
# {'predictions': [[0.121025]]}

Контейнер работает с нашей моделью,давая прогноз 0,121025 для входа [1, 1.]

0 голосов
/ 25 июня 2019

Надеюсь, это поможет:

import tensorflow as tf
from tensorflow.contrib.keras import backend as K
from tensorflow.python.client import device_lib

K.set_learning_phase(0)
model = tf.keras.models.load_model('my_model.h5')


export_path = './'
with K.get_session() as sess:
    tf.saved_model.simple_save(
        sess,
        export_path,
        inputs={'input_image': model.input},
        outputs={t.name: t for t in model.outputs}
    )
    print('Converted to SavedModel!!!')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...