#tensorflow #tensorflow-estimator #tensorflow-lite
#tensorflow #tensorflow-оценщик #tensorflow-lite
Вопрос:
Я использую оценщик тензорного потока для обучения и сохранения модели, а затем преобразования ее в .tflite. Я сохранил модель следующим образом:
feat_cols = [tf.feature_column.numeric_column('feature1'),
tf.feature_column.numeric_column('feature2'),
tf.feature_column.numeric_column('feature3'),
tf.feature_column.numeric_column('feature4')]
def serving_input_receiver_fn():
"""An input receiver that expects a serialized tf.Example."""
feature_spec = tf.feature_column.make_parse_example_spec(feat_cols)
default_batch_size = 1
serialized_tf_example = tf.placeholder(dtype=tf.string, shape=[default_batch_size], name='tf_example')
receiver_tensors = {'examples': serialized_tf_example}
features = tf.parse_example(serialized_tf_example, feature_spec)
return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)
dnn_regressor.export_saved_model(export_dir_base='model',
serving_input_receiver_fn=serving_input_receiver_fn)
Когда я пытаюсь преобразовать результирующий файл .pb с помощью:
tflite_convert --output_file=/tmp/foo.tflite --saved_model_dir=/tmp/saved_model
Я получаю исключение, в котором говорится, что операция ParseExample не поддерживается TensorFlow Lite.
Некоторые операторы в модели не поддерживаются стандартной средой выполнения TensorFlow Lite. Если это собственные операторы TensorFlow, вы можете использовать расширенную среду выполнения, передав —enable_select_tf_ops или установив target_ops=TFLITE_BUILTINS,SELECT_TF_OPS при вызове tf.lite .TFLiteConverter(). В противном случае, если у вас есть пользовательская реализация для них, вы можете отключить эту ошибку с помощью —allow_custom_ops или установив allow_custom_ops=True при вызове tf.lite .TFLiteConverter(). Вот список встроенных операторов, которые вы используете: CONCATENATION, FULLY_CONNECTED, RESHAPE . Вот список операторов, для которых вам понадобятся пользовательские реализации: ParseExample .
Если я попытаюсь экспортировать модель без сериализации, когда я попытаюсь спрогнозировать результирующий файл .pb, функция ожидает и пустой set() , а не dict входных данных, которые я передаю.
Ошибка значения: получены неожиданные ключи в input_dict: {‘feature1’, ‘feature2’, ‘feature3’, ‘feature4’} ожидаемый: set()
Что я делаю не так? Вот код, который пытается сохранить модель без выполнения какой-либо сериализации
features = {
'feature1': tf.placeholder(dtype=tf.float32, shape=[1], name='feature1'),
'feature2': tf.placeholder(dtype=tf.float32, shape=[1], name='feature2'),
'feature3': tf.placeholder(dtype=tf.float32, shape=[1], name='feature3'),
'feature4': tf.placeholder(dtype=tf.float32, shape=[1], name='feature4')
}
def serving_input_receiver_fn():
return tf.estimator.export.ServingInputReceiver(features, features)
dnn_regressor.export_savedmodel(export_dir_base='model', serving_input_receiver_fn=serving_input_receiver_fn, as_text=True)
Ответ №1:
РЕШАЕМАЯ
Используя build_raw_serving_input_receiver_fn, мне удалось экспортировать сохраненную модель без какой-либо сериализации:
serve_input_fun = tf.estimator.export.build_raw_serving_input_receiver_fn(
features,
default_batch_size=None
)
dnn_regressor.export_savedmodel(
export_dir_base="model",
serving_input_receiver_fn=serve_input_fun,
as_text=True
)
ПРИМЕЧАНИЕ: при выполнении прогнозирования предиктор не знает signature_def по умолчанию, поэтому мне нужно было его указать:
predict_fn = predictor.from_saved_model("model/155482...", signature_def_key="predict")
Также при преобразовании из .pb в .tflite я использовал Python API, потому что мне нужно было указать там также signature_def:
converter = tf.contrib.lite.TFLiteConverter.from_saved_model('model/155482....', signature_key='predict')