Coreml中的实例规范化

时间:2020-03-10 05:26:22

标签: ios keras coreml coremltools

我想在转换后的模型(从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模型可以预测。但是输出是错误的。 上面的方法错了吗?我该如何解决?

0 个答案:

没有答案