Моя конечная цель - использовать инструмент 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)
Следовательно, я отказался от этого метода, надеясь, что что-то еще позволит предварительно обработать ввод моей модели обслуживания.