Как преобразовать замороженный график (.pb) Tensorflow Simple Audio Recognition в модель Core ML? - PullRequest
0 голосов
/ 05 декабря 2018

Я пытался реализовать простое распознавание звука Tensorflow в приложении для iphone.После некоторых исследований я обнаружил, что мне нужно преобразовать файл .pb замороженного графика Tensorflow в базовую модель ML, а затем использовать его в приложениях для iOS.Поэтому я попытался выполнить этот пример и сослаться на этот преобразователь.Но похоже, что конвертер был в основном написан для преобразования моделей, которые принимают изображение в качестве входных данных. Но моя модель должна иметь возможность принимать аудио .wav файлы в качестве входных данных.`

import tfcoreml as tf_converter
tf_converter.convert(tf_model_path = 'my_frozen_graph.pb',
                     mlmodel_path = 'my_model.mlmodel',
                     output_feature_names = ['labels_softmax:0'],
                     class_labels = 'classes.txt'
                     )

Когда я пытаюсь преобразовать свой график в базовую модель ML, используя приведенный выше код, я получаю следующее сообщение об ошибке.

(env3) minimaci73$ python model.py
WARNING:root:Keras version 2.2.0 detected. Last version known to be fully compatible of Keras is 2.1.6 .
WARNING:root:TensorFlow version 1.8.0 detected. Last version known to be fully compatible is 1.5.0 .

Loading the TF graph...
Graph Loaded.
Traceback (most recent call last):
  File "/Users/minimaci73/anaconda3/envs/env3/lib/python3.6/site-packages/tfcoreml/_tf_coreml_converter.py", line 204, in _convert_pb_to_mlmodel
    shape_list = shape.as_list()
  File "/Users/minimaci73/anaconda3/envs/env3/lib/python3.6/site-packages/tensorflow/python/framework/tensor_shape.py", line 900, in as_list
    raise ValueError("as_list() is not defined on an unknown TensorShape.")
ValueError: as_list() is not defined on an unknown TensorShape.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "model.py", line 6, in <module>
    class_labels = 'conv_labels.txt'
  File "/Users/minimaci73/anaconda3/envs/env3/lib/python3.6/site-packages/tfcoreml/_tf_coreml_converter.py", line 586, in convert
    custom_conversion_functions=custom_conversion_functions)
  File "/Users/minimaci73/anaconda3/envs/env3/lib/python3.6/site-packages/tfcoreml/_tf_coreml_converter.py", line 206, in _convert_pb_to_mlmodel
    raise ValueError('Please provide the shape for the input {} through the argument \'input_name_shape_dict\''.format(input_name))
ValueError: Please provide the shape for the input wav_data:0 through the argument 'input_name_shape_dict'
(env3) minimaci73$

Согласно последнему сообщению об ошибке, мне нужно ввести форму ввода input wav_data:0.Итак, я создал текстовую сводку замороженного графика, как упомянуто в руководстве, и посмотрел на входную форму wav_data.Но входная форма для этого <unknown>.

enter image description here

Хотелось бы узнать, есть ли другие способы преобразования этого файла в базовую модель ML?или есть ли какой-нибудь способ использовать замороженный граф .pb файл непосредственно в приложении ios swift ?

Экспериментальная среда Tensorflow-эксперимента также плохо документирована.Если у вас, ребята, есть хороший ресурс по этому вопросу, пожалуйста, поделитесь.

Update В соответствии с журналом консоли я понизил версии keras и tensorflow, а также в соответствии с ответом Маттиса я добавил input_name_shape_dict = { "import/wav_data:0" : [1, 16, 44100, 1] Теперь консоль показывает ошибку по-другому

(env3) minimaci73$ python model.py

Loading the TF graph...
Traceback (most recent call last):
  File "model.py", line 7, in <module>
    class_labels = 'conv_labels.txt'
  File "/Users/minimaci73/anaconda3/envs/env3/lib/python3.6/site-packages/tfcoreml/_tf_coreml_converter.py", line 586, in convert
    custom_conversion_functions=custom_conversion_functions)
  File "/Users/minimaci73/anaconda3/envs/env3/lib/python3.6/site-packages/tfcoreml/_tf_coreml_converter.py", line 153, in _convert_pb_to_mlmodel
    tf.import_graph_def(gdef, name='')
  File "/Users/minimaci73/anaconda3/envs/env3/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 316, in new_func
    return func(*args, **kwargs)
  File "/Users/minimaci73/anaconda3/envs/env3/lib/python3.6/site-packages/tensorflow/python/framework/importer.py", line 541, in import_graph_def
    raise ValueError('No op named %s in defined operations.' % node.op)
ValueError: No op named DecodeWav in defined operations.
(env3) minimaci73$ python model.py

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете указать входную форму для преобразователя:

input_name_shape_dict={ "import/wav_data:0" : [1, input_height, input_width, channels] })

Если ваши данные одномерны, то высота и ширина должны быть равны 1, а каналы должны быть длиной данных.

Вы также можете столкнуться с другими ошибками преобразования, но это первый шаг.:-) (tfcoreml нужно знать форму ввода, чтобы он мог запустить модель с некоторыми поддельными данными.)

...