Сохранить / загрузить модель Keras с (постоянными) параметрами - PullRequest
0 голосов
/ 24 апреля 2020

Мой случай похож на, но немного отличается от "Сохранить / загрузить модель keras с константами"

Я создаю модель обнаружения объекта (на основе YOLO ) в tf.keras (TFv1.12, да, я знаю), чьи необработанные выходные данные должны быть постобработаны в ограничивающие рамки.

Это включает в себя несколько параметров, которые являются постоянными для целей модель, но параметры для сценария, который строит модель : например, количество классов и матрица «якорных» местоположений для создания блоков относительно.

Моя модель будет загружена в контейнер TFServing, поэтому я пытаюсь убедиться:

  1. Преобразование инкапсулировано в модель, а не заставляет пользователей делать это или не разделяет логи пост-обработки c
  2. Сохраненные артефакты модели (например, Keras h5 или TF pb + params) достаточны для загрузки и обслуживания модели

Как правильно это сделать?

Насколько как я мог сказать, следующее не работа:

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import backend as K
from tensorflow.keras.layers import Lambda, Layer

# Lambda layer using closure scope triggers error when trying to load the model:
# seems like `param` is defined but some weird object
def make_output_lambda(param):
    def mylambda(raw_output):
        return raw_output + param
    return Lambda(mylambda)

# Even if the custom layer type is added to `custom_objects` on
# `tf.keras.models.load_model()` - it seems to get called without the positional
# arguments:
class MyCustomLayer(Layer):
    def __init__(self, param, **kwargs):
        super(YOLOHeadLayer, self).__init__(**kwargs)
        self.param = param  # or K.constant(param) - same overall problem

    def call(self, inputs):
        return inputs + self.param

# Keras throws an error when creating a `Model` that depends on a constant
# tensor which isn't an `Input` (and who wants a constant "Input"?)
def lambdatwo(inputs):
    return inputs[0] + inputs[1]
param_tensor = K.constant(param)
y = Lambda(lambdatwo)((raw_output, param_tensor))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...