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