我们正在尝试将.h5 Keras模型转换为.mlmodel模型,我的代码如下:
from keras.models import load_model
import keras
from keras.applications import MobileNet
from keras.layers import DepthwiseConv2D
from keras.utils.generic_utils import CustomObjectScope
with CustomObjectScope({'relu6': keras.applications.mobilenet.relu6,'DepthwiseConv2D': keras.applications.mobilenet.DepthwiseConv2D}):
model = load_model('CNN_tourist_11.h5', custom_objects={'relu6': MobileNet})
output_labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
coreml_model = coremltools.converters.keras.convert("CNN_tourist_11.h5",
input_names="image",
image_input_names="image",
class_labels= output_labels,)
coremltools.utils.save_spec(coreml_model, 'place10.mlmodel')
我们正在寻找6天前提出的类似问题,并且我们也导入了MobileNet,但是它仍然显示此错误:
AttributeError: module 'keras.applications.mobilenet' has no attribute 'relu6'
我的Tensorflow版本是1.10.0 Keras版本是2.2.2
如果有人能给我们提出建议,为什么它持续显示此错误,我们将非常感谢,非常感谢。
答案 0 :(得分:0)
我修改了代码:
• Server-side synchronization
• Microsoft Dynamics 365 for Outlook (includes a synchronization agent).
打印输出的某些部分:
from keras.models import load_model
import keras
from keras.applications import MobileNet
from keras.layers import DepthwiseConv2D
#from keras.utils.generic_utils import CustomObjectScope
#with CustomObjectScope({'relu6': keras.applications.mobilenet.relu6,'DepthwiseConv2D': keras.applications.mobilenet.DepthwiseConv2D}):
#model = load_model('CNN_tourist_11.h5', custom_objects={'relu6': MobileNet})
output_labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
coreml_model = coremltools.converters.keras.convert("CNN_tourist_11.h5",
input_names="image",
image_input_names="image",
class_labels= output_labels,)
coremltools.utils.save_spec(coreml_model, 'place10.mlmodel')
答案 1 :(得分:0)
实际上,问题由@Rex自己在评论中回答。我只想对遇到相同问题的人做出简短的回答。
此问题与keras无关,而与coremltools有关。您需要在coremltools文件中找到一个_layers2.py
并注释掉from keras_application.mobilenet import relu6
:
在_layer2.py
处找到[YOUR_PYTHON_INSTALL_DIR]/lib/python3.6/site-packages/coremltools/converters/keras/_layers2.py
注释如下:
if _keras.__version__ >= _StrictVersion('2.2.0'):
from keras.layers import DepthwiseConv2D
# Modified by KF 10/16/2018
# from keras_applications.mobilenet import relu6
else:
from keras.applications.mobilenet import DepthwiseConv2D, relu6
然后,在您的代码中,删除与Keras相关的所有导入,它们并不相关;
对于'Sequential' object has no attribute 'SerializeToString'
错误,请使用coreml_model.save
代替tools.utils.save_spec()
。
# from keras.models import load_model
# import keras
# from keras.applications import MobileNet
# from keras.layers import DepthwiseConv2D
output_labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
coreml_model = coremltools.converters.keras.convert("CNN_tourist_11.h5",
input_names="image",
image_input_names="image",
class_labels= output_labels,)
#coremltools.utils.save_spec(coreml_model, 'place10.mlmodel')
coreml_model.save('place10.mlmodel')
问题解决了。
答案 2 :(得分:-1)
在最新的Keras版本中,MobileNet的组件已与Keras的其余层集成在一起,因此不再作为mobilenet软件包的一部分提供。然后,您需要将代码更改为:
from keras.models import load_model
import keras
from keras.applications import MobileNet
from keras.layers import DepthwiseConv2D
model = load_model('CNN_tourist_11.h5')
output_labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
coreml_model = coremltools.converters.keras.convert("CNN_tourist_11.h5",
input_names="image",
image_input_names="image",
class_labels= output_labels,)
coremltools.utils.save_spec(coreml_model, 'place10.mlmodel')