У меня есть 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
Что я делаю неправильно?