Преобразование модели Tensorflow в модель CoreML.В OP Slice отсутствует переводчик формы - PullRequest
0 голосов
/ 29 ноября 2018

Я использую TFCoreml в Python для преобразования моей модели Tensorflow в CoreML для разработки на устройстве iOS с использованием CoreML Libs.

Я использую следующий код Python, чтобы попытаться преобразовать модель в CoreML.

import tfcoreml as tf_converter

tf_converter.convert(tf_model_path = 'frozen_inference_graph.pb', 
                     mlmodel_path = 'ml_model.mlmodel', 
                     output_feature_names = ['SemanticPredictions:0'],
                      input_name_shape_dict =  {'ImageTensor:0' : [1, 512, 512, 3]})

Это приводит к следующей ошибке:

Отсутствует преобразователь формы для OP типа Slice.

IПрочитайте документы немного подробнее о TFCoreml, и в нем говорится, что Slice не полностью поддерживается, и для этого необходим некоторый пользовательский код преобразования.В документации TFCoreml он предлагает разбить замороженный граф на подграфы и преобразовать их по отдельности, а затем объединить их вместе после преобразования.

Я обновил свой код, чтобы использовать пользовательские слои, но я не совсем понимаю, как пользовательскийфункции преобразования работают.

Просто нужно несколько указателей на то, где искать, чтобы начать понимать, как писать эти пользовательские методы преобразования, чтобы я мог решить мою проблему с преобразованием модели Tensorflow в CoreML.

[РЕДАКТИРОВАТЬ]

Я еще кое-что прочитал в примерах и документации TFCoreml и приспособил свое решение к этому.

import tfcoreml as tf_converter

def _convert_slice(**kwargs):
    tf_op = kwargs["op"]
    coreml_nn_builder = kwargs["nn_builder"]
    constant_inputs = kwargs["constant_inputs"]

    params = NeuralNetwork_pb2.CustomLayerParams()
    params.className = 'Slice'
    params.description = "Custom layer that corresponds to the slice TF op"
    # get the value of begin
    begin = constant_inputs.get(tf_op.inputs[1].name, [0,0,0,0])
    size = constant_inputs.get(tf_op.inputs[2].name, [0,0,0,0])
    # add begin and size as two repeated weight fields
    begin_as_weights = params.weights.add()
    begin_as_weights.floatValue.extend(map(float, begin))
    size_as_weights = params.weights.add()
    size_as_weights.floatValue.extend(map(float, size))
    coreml_nn_builder.add_custom(name=tf_op.name,
                                input_names=[tf_op.inputs[0].name],
                                output_names=[tf_op.outputs[0].name],
                                custom_proto_spec=params)

coreml_model = tfcoreml.convert(
        tf_model_path='frozen_inference_graph.pb',
        mlmodel_path='my_model.mlmodel',
        input_name_shape_dict={'ImageTensor:0':[1, 512, 512, 3]},
        output_feature_names=['SemanticPredictions:0'],
        add_custom_layers=True,
        custom_conversion_functions={'Slice': _convert_slice}) # dictionary has op name as the key

print("\n \n ML Model layers info: \n")
# inspect the CoreML model: this should be same as the one we got above
spec = coreml_model.get_spec()
_print_coreml_nn_layer_info(spec)

Я все еще получаю ту же ошибку, что и раньше

Отсутствует переводчик формы для OP типа Slice.

Но я заметил, что я также получаю эту ошибку / предупреждение

custom_conversion_functions = {'Slice': _convert_slice}) # словарь имеет имя операции в качестве ключа

Любая помощь будет оценена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...