TensorflowServing на обученной собственной модели Keras с функцией предварительной обработки для ввода - PullRequest
1 голос
/ 25 июня 2019

Моя конечная цель - использовать инструмент 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)

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

1 Ответ

0 голосов
/ 01 июля 2019

Если вы хотите использовать 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

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

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

...