gpt4 book ai didi

python - Tensorflow 在经过训练的 native Keras 模型上提供服务,并具有输入预处理功能

转载 作者:太空宇宙 更新时间:2023-11-03 20:43:00 24 4
gpt4 key购买 nike

我的最终目标是在张量板上使用假设工具。为此,我需要在 TensorflowServing 上提供 Keras 模型,并在 TFRecordFile 中提供数据。所以数据必须转换成tf.Examples。该工具应该抓取网络来对数据进行推理。但是,网络无法将 tf.Examples 作为输入进行处理。所以服务的模型需要有预处理功能。

根据tensorflow文档,一种方法是创建一个tensorflow Estimator,并使用“serving_input_receiver_fn”来预处理数据。这本来是完美的,除非我无法将已经训练好的原生 Keras 模型制作成估算器。这似乎是从 tf.keras 模型(而不是像我这样的 native keras 模型)创建它并直接使用估计器对其进行训练的唯一方法。

另一种方法是使用 tf.saved_model.simple_save 函数,然后使用 TensorflowServing,但我没有找到一种方法来预处理 tf.Examples 以便为网络提供正确的输入。

由于这不起作用,我不知道如何解决这个问题。

编辑:我尝试将我的 native keras 转换为 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

但是,由于 Lambda 层,这不起作用。在配置层,函数现在编写为:

'function': ('4wIAAAAAAAAAAgAAAAMAAABTAAAAcxQAAAB8AGQBGQB8AGQC8ARQAFwBTACkDTukAAAAA6QEA\nAACpACkC2gZpbaBXNjYWxlcgMAAAByAwAAAPp/L2dwZnMvaGFpZmEtcDYvMDMvbXNpZXZl\nX2RldjMvdXNyL3BhdWxkYS9naXRfcmVwb0hJLUltYWdlQW5hbHl0aWNzL3Jlc291cmNlcy9y\ndW5fMTE3NC9jdXN0b21fcHJldHJhaW5lZF9JbmNlcHRpb25SZXNOZXRWMi5wedoIPGxhbWJkYT6d\nAAAA8wAAAAA=\n', None, None)

因此,我放弃了这种方法,希望有其他方法可以预处理我的服务模型的输入。

最佳答案

如果你想使用 Tensorflow Serving,在我看来,使用 Native Keras 会很难做到。

如果您想为 Training 准备数据和Serving ,您可以使用 Tensorflow Transform 执行相应的转换.

但是如果您只想为Serving准备数据,最好的方法是您提到的方法,“这似乎是从 tf.keras 模型(而不是像我这样的 native 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 模型转换为 Estimator:

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

关于python - Tensorflow 在经过训练的 native Keras 模型上提供服务,并具有输入预处理功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56754293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com