Операция ParseExample не поддерживается при преобразовании SavedModel в TFLite - PullRequest
1 голос
/ 13 апреля 2019

Я использую оценщик TensorFlow для обучения и сохранения модели, а затем конвертирую ее в .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 (), а не диктовку входных данных, которые я передаю.

ValueError: Получены неожиданные ключи в 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 Ответ

0 голосов
/ 15 апреля 2019

решаемые

Используя 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
)

ПРИМЕЧАНИЕ : При прогнозировании Predictor не знает default_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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...