Ios coreml中的实例规范化
我希望在转换的模型中使用实例规范化(Keras到CoreML) Keras contrib实例规范化在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
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)