Как экспортировать рекомендации модели Keras из примера Tensorflow в tflite? - PullRequest
0 голосов
/ 29 марта 2020

Я очень новичок в Tensorflow и машинном обучении. Я использовал пример на странице GitHub Tensorflow: Tensorflow / models / official / advice / * / 1001 *

https://github.com/tensorflow/models/tree/master/official/recommendation

Я запускаю movielens.py, затем ncf_keras_main.py как инструкции говорят Все работает нормально, и у меня есть выходные данные в директории ~ / ml-small-model /:

ml-small-model/
    checkpoint
    checkpoint.data-0000-of-00001
    checkpoint.index
    summaries/
        train/
            events.out.tfevents.1585469662.DESKTOP-CAEB4HN.24292.515.v2
            plugins/
                2020_03_29_08_14_24/
                    DESKTOP-CAEB4HN.input_pipeline.pb
                    DESKTOP-CAEB4HN.kernel_stats.pb
                    DESKTOP-CAEB4HN.overview_page.pb
                    DESKTOP-CAEB4HN.tensorflow_stats.pb
                    DESKTOP-CAEB4HN.trace.json.gz
        validation/
            events.out.tfevents.1585469676.DESKTOP-CAEB4HN.24292.7424.v2

Проблема в том, что я хочу развернуть эту обученную модель в Firebase mlkit как файл tflite. Я просмотрел примеры на веб-сайтах Google и в других публикациях по переполнению стека, и, кажется, есть два способа решения этой проблемы: использование файлов .pb типа SavedModel или использование tfliteconverter. Я видел только примеры преобразования одного файла .pb, и у меня было несколько, поэтому я выбрал последний. Я записал это в строки прямо перед оператором return метода run_ncf (_) в ncf_keras_main.py, поскольку он, похоже, является последним, что выполняется перед программой:

  #convert and export to tflite
  tflite_model_files = pathlib.Path("C:/ml-small-model/ml-small.tflite")
  converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)
  tflite_model = converter.convert()
  tflite_model_files.write_bytes(tflite_model)
  open("converted_model.tflite", "wb").write(tflite_model)

Однако я получаю a ValueError:

Traceback (most recent call last):
  File ".\ncf_keras_main.py", line 578, in <module>
    app.run(main)
  File "!\python\python37\lib\site-packages\absl\app.py", line 299, in run
    _run_main(main, args)
  File "!\python\python37\lib\site-packages\absl\app.py", line 250, in _run_main
    sys.exit(main(argv))
  File ".\ncf_keras_main.py", line 573, in main
    run_ncf(FLAGS)
  File ".\ncf_keras_main.py", line 347, in run_ncf
    converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\lite\python\lite.py", line 503, in from_keras_model
    concrete_func = func.get_concrete_function()
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\eager\def_function.py", line 958, in get_concrete_function
    concrete = self._get_concrete_function_garbage_collected(*args, **kwargs)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\eager\def_function.py", line 864, in _get_concrete_function_garbage_collected
    self._initialize(args, kwargs, add_initializers_to=initializers)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\eager\def_function.py", line 506, in _initialize
    *args, **kwds))
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\eager\function.py", line 2446, in _get_concrete_function_internal_garbage_collected
    graph_function, _, _ = self._maybe_define_function(args, kwargs)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\eager\function.py", line 2777, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\eager\function.py", line 2667, in _create_graph_function
    capture_by_value=self._capture_by_value),
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\framework\func_graph.py", line 981, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\eager\def_function.py", line 441, in wrapped_fn
    return weak_wrapped_fn().__wrapped__(*args, **kwds)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\saving\saving_utils.py", line 132, in _wrapped_model
    outputs = model(inputs, training=False)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 933, in __call__
    outputs = call_fn(cast_inputs, *args, **kwargs)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\engine\network.py", line 719, in call
    convert_kwargs_to_constants=base_layer_utils.call_context().saving)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\engine\network.py", line 888, in _run_internal_graph
    output_tensors = layer(computed_tensors, **kwargs)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 933, in __call__
    outputs = call_fn(cast_inputs, *args, **kwargs)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\autograph\impl\api.py", line 309, in wrapper
    return func(*args, **kwargs)
  File ".\ncf_keras_main.py", line 80, in call
    self.add_metric(hr_sum, name="hr_sum", aggregation="mean")
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 1360, in add_metric
    self._add_metric(value, aggregation, name)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 2148, in _add_metric
    metric_obj(value)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\metrics.py", line 214, in __call__
    replica_local_fn, *args, **kwargs)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\distribute\distributed_training_utils.py", line 1133, in call_replica_local_fn
    return fn(*args, **kwargs)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\metrics.py", line 194, in replica_local_fn
    update_op = self.update_state(*args, **kwargs)  # pylint: disable=not-callable
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\utils\metrics_utils.py", line 90, in decorated
    update_op = update_state_fn(*args, **kwargs)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\keras\metrics.py", line 356, in update_state
    update_total_op = self.total.assign_add(value_sum)
  File "~\movie_data\models\official\recommendation\venv\lib\site-packages\tensorflow\python\distribute\values.py", line 1004, in assign_add
    "SyncOnReadVariable does not support `assign_add` in "
ValueError: SyncOnReadVariable does not support `assign_add` in cross-replica context when aggregation is set to `tf.VariableAggregation.SUM`.

I censored the directory since it had some personal info, so I apologize if it looks weird

Я посмотрел на ошибку, но, похоже, она вообще не возникает с другими.

В конечном итоге у меня есть 2 вопроса:

  1. Что я могу сделать, чтобы получить выходной файл tflite, используя пример с рекомендациями моделей tenorflow? (Могу ли я что-нибудь сделать с pb-файлами?)
  2. Если получить tflite и развернуть его в firebase сложнее, чем другая идея, как еще можно развернуть эту модель ml, чтобы получить рекомендации?

Любые другие советы и хитрости тоже подойдут.

...