我正在使用Keras 2.1.3,我想将MobileNet转换为CoreML:
from keras.applications import MobileNet
from keras.applications.mobilenet import relu6
from keras.applications.mobilenet import DepthwiseConv2D
import coremltools.converters.keras as k
def save_model():
model = MobileNet(input_shape=(128,128,3), include_top=False)
model.save('temp.h5')
def convert():
model = k.convert('temp.h5',
input_names=['input'],
output_names=['output'],
model_precision='float16',
custom_conversion_functions={'relu6': relu6, 'DepthwiseConv2D': DepthwiseConv2D})
model.save('temp.model')
save_model()
convert()
这会导致错误:ValueError: Unknown activation function:relu6
答案 0 :(得分:1)
对于Keras 2.2.4和Tensorflow 1.12.0,我找到了解决方案。
保存模型权重和架构,如:
model_json = model.to_json()
open('architecture.json', 'w').write(model_json)
model.save_weights('weights.h5', overwrite=True)
为了将模型转换为CoreML .mlmodel,我使用:
import coremltools
from keras.layers import DepthwiseConv2D, ReLU
from pathlib import Path
from keras.models import model_from_json
from tensorflow.python.keras.utils.generic_utils import CustomObjectScope
model_architecture = './Networks/architecture.json'
model_weights = './Networks/weights.h5'
model_structure = Path(model_architecture).read_text()
with CustomObjectScope({'relu6': ReLU ,'DepthwiseConv2D': DepthwiseConv2D}):
model = model_from_json(model_structure)
model.load_weights(model_weights)
output_labels = ['0', '1', '2', '3', '4', '5', '6']
coreml_model = coremltools.converters.keras.convert(
model, input_names=['image'], output_names=['output'],
class_labels=output_labels, image_input_names='image')
coreml_model.save('ModelX.mlmodel')
答案 1 :(得分:0)
这是基于https://github.com/apple/coremltools/issues/38
的解决方案from keras.applications import MobileNet
import keras
import coremltools.converters.keras as k
from keras.utils.generic_utils import CustomObjectScope
def save_model():
model = MobileNet(input_shape=(128,128,3), include_top=False)
model.save('temp.h5')
def convert():
with CustomObjectScope({'relu6': keras.applications.mobilenet.relu6,
'DepthwiseConv2D': keras.applications.mobilenet.DepthwiseConv2D}):
model = k.convert("temp.h5",
input_names=['input'],
output_names=['output'],
model_precision='float16')
model.save('temp.mlmodel')
save_model()
convert()