Мой случай похож на, но немного отличается от "Сохранить / загрузить модель keras с константами"
Я создаю модель обнаружения объекта (на основе YOLO ) в tf.keras
(TFv1.12, да, я знаю), чьи необработанные выходные данные должны быть постобработаны в ограничивающие рамки.
Это включает в себя несколько параметров, которые являются постоянными для целей модель, но параметры для сценария, который строит модель : например, количество классов и матрица «якорных» местоположений для создания блоков относительно.
Моя модель будет загружена в контейнер TFServing, поэтому я пытаюсь убедиться:
- Преобразование инкапсулировано в модель, а не заставляет пользователей делать это или не разделяет логи пост-обработки c
- Сохраненные артефакты модели (например, 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))