Пример синтаксического анализа операции не поддерживается при преобразовании SavedModel в TFLite

#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')