Преобразование модели Keras в Core ML с помощью пользовательского слоя - функция преобразования игнорируется - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь преобразовать модель, которая была обучена через Keras, с TensorFlow 1.x в качестве бэкэнда в формат Core ML (.mlmodel). У меня есть полный исходный код и веса для модели, а также замороженный график Кераса (файл .h5). Моя модель (см. Архитектуру здесь) определяется с помощью функционального API Keras и имеет один пользовательский слой с именем AttentionWeightedAverage.

При выполнении следующего кода преобразования я получаю ValueError: Unknown layer: AttentionWeightedAverage.

import coremltools
mlmodel = coremltools.converters.keras.convert('deepmoji_model.h5')

Естественно, поскольку это пользовательский слой (который также имеет единственный логический гиперпараметр с именем return_attention), я понял, что мне нужно сказать Core ML, как чтобы справиться с этим, я реализовал следующее на основе Matthi js большого сообщения в блоге Холлемана :

class AttentionWeightedAverage(Layer):
    # class defined inline here ...
    # https://github.com/bfelbo/DeepMoji/blob/master/deepmoji/attlayer.py

def convert_ATTN(layer):
    params = NeuralNetwork_pb2.CustomLayerParams()
    params.className = "AttentionWeightedAverage"
    params.description = "A fancy new activation function"

    params.parameters["return_attention"].boolValue = layer.return_attention
    return params


mlmodel = coremltools.converters.keras.convert('deepmoji_model.h5',
                                               add_custom_layers=True,
                                               custom_conversion_functions={"AttentionWeightedAverage": convert_ATTN}
                                              )

Однако я все еще получаю ту же ошибку "Неизвестный слой" как указано выше при попытке запустить преобразование. Что может быть причиной того, что скрипт преобразования не распознает предоставленную мной функцию преобразования?

Я запускаю coremltools == 3.3 (последний) с keras == 2.3.1. Любое руководство очень ценится!

1 Ответ

0 голосов
/ 14 февраля 2020

Оказывается, ошибка Unknown layer произошла от самого Keras, который не смог успешно load_model, поскольку не смог десериализовать пользовательский слой. Если вместо этого мы передаем преобразователю полностью десериализованную модель (а не просто путь к файлу), преобразователь работает без проблем.

model = load_model('deepmoji_model.h5', custom_objects={'AttentionWeightedAverage': AttentionWeightedAverage()})

mlmodel = coremltools.converters.keras.convert(model,
                                               add_custom_layers=True,
                                               custom_conversion_functions={"AttentionWeightedAverage": convert_ATTN}
                                              )
mlmodel.save('deepmoji_model.mlmodel')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...