Core ML coremltools AttributeError: модуль 'keras.applications.mobilenet' не имеет атрибута 'relu6' - PullRequest
0 голосов
/ 10 октября 2018

Мы пытаемся преобразовать модель .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 голосов
/ 10 октября 2018

Я изменил свой код:

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

Некоторые части распечатки:

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/coremltools/converters/keras/_layers2.py in <module>()
      8 if _keras.__version__ >= _StrictVersion('2.2.0'):
      9     from keras.layers import DepthwiseConv2D
---> 10     from keras_applications.mobilenet import relu6
     11 else:
     12     from keras.applications.mobilenet import DepthwiseConv2D, relu6

ImportError: cannot import name 'relu6'
0 голосов
/ 16 октября 2018

На самом деле на вопрос отвечает сам @Rex в комментариях.Я просто хочу сделать это кратким и понятным как «Ответ» для людей, сталкивающихся с той же проблемой.

Эта проблема не о keras, а о coremltools.Вам нужно найти _layers2.py в файлах coremltools и закомментировать 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')

Проблема решена.

0 голосов
/ 10 октября 2018

В последних версиях 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')
...