Я хочу использовать Instance Normalization в преобразованной модели (от Keras до CoreML).
Keras contrib Нормализация экземпляра рассматривается как пользовательский слой в coreML. Поэтому я скопировал пользовательский слой следующим образом.
def create_instance_normalization_spec(layer):
input_name = layer._inbound_nodes[0].inbound_layers[0].name
input_name += '_output'
output_name = layer.name + '_output'
spec_layer = NeuralNetwork_pb2.NeuralNetworkLayer()
spec_layer.name = layer.name
spec_layer.input.append(input_name)
spec_layer.output.append(output_name)
spec_layer_params = spec_layer.batchnorm
weights = layer.get_weights()
channels = weights[0].shape[0]
idx = 0
gamma, beta = None, None
if layer.scale:
gamma = weights[idx]
idx += 1
if layer.center:
beta = weights[idx]
idx += 1
epsilon = layer.epsilon or 1e-5
spec_layer_params.channels = channels
spec_layer_params.gamma.floatValue.extend(map(float,
gamma.flatten()))
spec_layer_params.beta.floatValue.extend(map(float,
beta.flatten()))
spec_layer_params.epsilon = epsilon
spec_layer_params.computeMeanVar = True
spec_layer_params.instanceNormalization = True
instance_norm_spec =
create_instance_normalization_spec(keras_model.layers[-1])
instance_norm_spec.input[:] = ["input1"]
instance_norm_spec.output[:] = ["output1"]
mlmodel._spec.neuralNetwork.layers[-1].CopyFrom(instance_norm_spec)
Теперь эта модель coreML может предсказать. Но выходные данные неверны. Путь выше неправильный? Как я могу это исправить?