TensorflowServing на обученной собственной модели Keras с функцией предварительной обработки для ввода

Моя конечная цель - использовать инструмент What-If-Tool на тензорной доске. Для этого мне нужно обслуживать мою модель Keras на TensorflowServing и данные в TFRecordFile. Поэтому данные необходимо преобразовать в tf.Examples. Предполагается, что инструмент захватывает сеть для выполнения логического вывода по данным. однако сеть не может обрабатывать tf.Examples в качестве входных данных. Таким образом, обслуживаемая модель должна иметь функцию предварительной обработки.

Согласно документации по тензорному потоку, одним из способов является создание оценщика тензорного потока и использование "serve_input_receiver_fn" для предварительной обработки данных. Это было бы идеально, за исключением случая, когда я не могу превратить уже обученную родную модель Keras в оценщик. Кажется, это единственный способ создать его из модели tf.keras (а не из собственной модели keras, как у меня) и обучить ее непосредственно с помощью оценщика.

Другой способ - использовать функцию tf.saved_model.simple_save, а затем использовать TensorflowServing, но я не нашел способа предварительно обработать tf.Examples, чтобы сделать правильный ввод для сети.

Поскольку это не работает, я понятия не имею, как решить эту проблему.

Изменить: я попытался преобразовать свои родные керасы в модель tf.keras. Моя модель действительно большая, поэтому я создаю эту функцию:

def create_tf_keras_model_from_native_keras(native_model):
    list_layers = []
    for i, layer in enumerate(native_model.layers):
        type_layer = str(layer).split('.')[2]
        second_type_layer = str(layer).split('.')[3].split(' ')[0]
        if type_layer == 'input_layer':
            new_layer = tf.keras.layers.InputLayer(**layer.get_config())
        elif type_layer == 'convolutional':
            new_layer = tf.keras.layers.Conv2D(**layer.get_config())
        elif type_layer == 'normalization':
            new_layer = tf.keras.layers.BatchNormalization(**layer.get_config())
        elif type_layer == 'core':
            if second_type_layer == 'Activation':
                new_layer = tf.keras.layers.Activation(**layer.get_config())
            elif second_type_layer == 'Dense':
                new_layer = tf.keras.layers.Dense(**layer.get_config())
            elif second_type_layer == 'Dropout':
                new_layer = tf.keras.layers.Dropout(**layer.get_config())
            elif second_type_layer == 'Lambda':
                config_lambda = layer.get_config()
                print(config_lambda)
                del config_lambda['function_type']
                del config_lambda['output_shape_type']
                new_layer = tf.keras.layers.Lambda(**config_lambda)
        elif type_layer == 'pooling':
            if second_type_layer == 'MaxPooling2D':
                new_layer = tf.keras.layers.MaxPooling2D(**layer.get_config())
            elif second_type_layer == 'AveragePooling2D':
                new_layer = tf.keras.layers.AveragePooling2D(**layer.get_config())
            elif second_type_layer == 'GlobalMaxPooling2D':
                new_layer = tf.keras.layers.GlobalMaxPooling2D(**layer.get_config())
        if new_layer == 'merge':
            new_layer = tf.keras.layers.Concatenate(**layer.get_config())
        list_layers.append(new_layer)
    model = tf.keras.Sequential(list_layers)
    return model

Однако это не работает из-за слоя лямбда. На уровне конфигурации функция теперь записана в виде:

'function': ('4wIAAAAAAAAAAgAAAAMAAABTAAAAcxQAAAB8AGQBGQB8AGQC8ARQAFwBTACkDTukAAAAA6QEA\nAACpACkC2gZpbaBXNjYWxlcgMAAAByAwAAAPp/L2dwZnMvaGFpZmEtcDYvMDMvbXNpZXZl\nX2RldjMvdXNyL3BhdWxkYS9naXRfcmVwb0hJLUltYWdlQW5hbHl0aWNzL3Jlc291cmNlcy9y\ndW5fMTE3NC9jdXN0b21fcHJldHJhaW5lZF9JbmNlcHRpb25SZXNOZXRWMi5wedoIPGxhbWJkYT6d\nAAAA8wAAAAA=\n', None, None)

Следовательно, я отказался от этого метода, надеясь, что что-то еще позволит предварительно обработать ввод моей модели обслуживания.


person pdaoudi    schedule 25.06.2019    source источник


Ответы (1)


Если вы хотите использовать Tensorflow Serving, на мой взгляд, это будет сложно сделать с помощью Native Keras.

Если вы хотите подготовить данные для Training и Serving, вы можете выполнить соответствующие преобразования с помощью Tensorflow Transform.

Но если вы хотите подготовить данные только для Serving, лучший способ - тот, который вы упомянули, "Похоже, что единственный способ создать их из модели tf.keras (а не из собственной модели keras, такой как У меня есть), и обучить его непосредственно с помощью оценщика. "

И вы правильно сказали, что это невозможно сделать с помощью функции tf.saved_model.simple_save.

Пример кода для создания модели Keras показан ниже, а преобразование его в Estimator показано ниже:

import tensorflow as tf
from tensorflow.python import keras
from tensorflow.python.keras import layers
from tensorflow.python.keras import models

def get_keras_model():
    inputs = layers.Input(shape=(INPUT_SHAPE,), name=INPUT_FEATURE)
    dense256 = layers.Dense(256, activation='relu')(inputs)
    dense32 = layers.Dense(32, activation='relu')(dense256)
    outputs = layers.Dense(NUM_CLASSES, activation='softmax')(dense32)
    model = models.Model(inputs, outputs)
    return model

Затем преобразуйте модель Кераса в оценщик, используя приведенный ниже код:

classifier = tf.keras.estimator.model_to_estimator(keras_model=model, model_dir=FLAGS.model_dir)

Для получения дополнительной информации перейдите по ссылке https://github.com/yu-iskw/tensorflow-serving-example/blob/master/python/train/mnist_keras_estimator.py

person Tensorflow Support    schedule 01.07.2019
comment
Спасибо за ответ. Я ответил вам, добавив Edit к моему исходному вопросу (количество символов, разрешенных в ответе, было слишком маленьким). - person pdaoudi; 01.07.2019