Модель Keras, содержащая подмодель Efficien tNet, не может загружать веса; VGG работает отлично - PullRequest
1 голос
/ 29 апреля 2020

У меня есть ubermodel, которая использует подмодель в качестве слоя для извлечения объектов. Мой код является модульным, так что я могу легко переключаться на то, какую субмодель я использую для извлечения объектов, просто меняя любую подмодель, которую я назначаю:

...

elif FEATURE_EXTRACTOR == "VGG16":

    Features = keras.applications.VGG16(

        weights = "imagenet",
        pooling = FEATURE_POOLING,
        include_top = False

    )
elif FEATURE_EXTRACTOR == "EfficientNetB0":

    Features = keras_applications_master.keras_applications.efficientnet.EfficientNetB0(
    # ^ Local copy of official keras repo: https://github.com/keras-team/keras-applications
    # because pip install --upgrade keras doesn't install version with efficientnet.

        weights = "imagenet",
        include_top = False,
        pooling = FEATURE_POOLING,
        classes = None

    )

...

Мои подпрограммы для сохранения и загрузки ubermodel и его весов также Зная, какая подмодель используется для извлечения признаков:

model.load_weights(submodel_specific_path)

С любой подмоделью я могу выполнить начальный обучающий прогон и сохранить ubermodel на диск. И если я пытаюсь продолжить обучение или точную настройку любой ubermodel, содержащей подмодель VGG16, используя load_weights для загрузки весов, все работает нормально. Но когда я load_weights любой ubermodel с подмоделью efficien tnet (или, скажем, keras.applications.xception.Xception), я получаю следующую ошибку:

Traceback (most recent call last):
  File "image_model.py", line 284, in <module>
    model.load_weights(model_path)
  File "C:\Users\Username\Anaconda3\envs\tensorflow1\lib\site-packages\keras\engine\saving.py", line 492, in load_wrapper
    return load_function(*args, **kwargs)
  File "C:\Users\Username\Anaconda3\envs\tensorflow1\lib\site-packages\keras\engine\network.py", line 1227, in load_weights
    reshape=reshape)
  File "C:\Users\Username\Anaconda3\envs\tensorflow1\lib\site-packages\keras\engine\saving.py", line 1294, in load_weights_from_hdf5_group_by_name
    reshape=reshape)
  File "C:\Users\Username\Anaconda3\envs\tensorflow1\lib\site-packages\keras\engine\saving.py", line 861, in preprocess_weights_for_loading
    weights = convert_nested_model(weights)
  File "C:\Users\Username\Anaconda3\envs\tensorflow1\lib\site-packages\keras\engine\saving.py", line 836, in convert_nested_model
    original_backend=original_backend))
  File "C:\Users\Username\Anaconda3\envs\tensorflow1\lib\site-packages\keras\engine\saving.py", line 980, in preprocess_weights_for_loading
    weights[0] = np.transpose(weights[0], (3, 2, 0, 1))
  File "<__array_function__ internals>", line 6, in transpose
  File "C:\Users\Username\Anaconda3\envs\tensorflow1\lib\site-packages\numpy\core\fromnumeric.py", line 651, in transpose
    return _wrapfunc(a, 'transpose', axes)
  File "C:\Users\Username\Anaconda3\envs\tensorflow1\lib\site-packages\numpy\core\fromnumeric.py", line 61, in _wrapfunc
    return bound(*args, **kwds)
ValueError: axes don't match array

Что я делаю неправильно?

...