Ios coreml中的实例规范化

Ios coreml中的实例规范化,ios,keras,coreml,coremltools,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

我希望在转换的模型中使用实例规范化(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
现在,这个coreML模型可以预测,但是输出是错误的。
上面的路错了吗?如何修复它?

可能Keras版本的实例规范化执行的计算与Core ML版本不同。您必须查看Keras版本的文档或源代码,以及coremltools中NeuralNetwork.proto中的注释,看看它们是否计算了相同的东西。我正在使用你的CoreML助手。我检查keras和coreML之间的差异。非常感谢你!!
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)