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