Я использую 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}) # словарь имеет имя операции в качестве ключа
Любая помощь будет оценена