python - 将 MobileNet 从 Keras 转换为 CoreML
问题描述
我正在使用 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
解决方案
对于 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')
推荐阅读
- c - 如何生成从0到n的重复整数序列?
- arrays - 来自 2 个列表/数组的一对中的最小元素
- python - mxnet.base.MXNetError:形状不一致,提供 = [32,4],推断形状 = [32,1]
- angular - 在 pdf 和图像上绘图
- r - OpenCPU 公共服务器是否仍然可用?API 规范似乎已更改
- python - 如何将扩展父类的属性获取到其嵌套的子类?
- javascript - 使用 AJAX 通过 Id 获取数据 | JSON ASP.NET
- apache-flink - 如何使用 java 在 Apache flink 中读取 json 文件格式
- python - Django,用户注册后创建新的配置文件模式时出错
- javascript - 如何使用 JavaScript 或任何方式在移动设备中停止引导 4 轮播自动滑动