核心ML coremltools AttributeError:模块'keras.applications.mobilenet'没有属性'relu6'

时间:2018-10-10 10:13:59

标签: keras coremltools relu

我们正在尝试将.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

如果有人能给我们提出建议,为什么它持续显示此错误,我们将非常感谢,非常感谢。

3 个答案:

答案 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')