ошибка с началом kerasV3 "base_model.get_layer ('custom')" ValueError: Нет такого слоя: custom - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь извлечь функции, используя предварительно обученную модель inceptionV3 (поставляется в приложении keras).Мой код имеет следующий блок:

 base_model = InceptionV3(include_top=include_top, weights=weights, input_tensor=Input(shape=(299,299,3)))
 model = Model(input=base_model.input, output=base_model.get_layer('custom').output)
 image_size = (299, 299)

, когда я запускаю это, он выдает следующую ошибку:

ValueError                                Traceback (most recent call last)
<ipython-input-24-fa1f85b62b84> in <module>()
     20 elif model_name == "inceptionv3":
     21   base_model = InceptionV3(include_top=include_top, weights=weights, input_tensor=Input(shape=(299,299,3)))
---> 22   model = Model(input=base_model.input, output=base_model.get_layer('custom').output)
     23   image_size = (299, 299)
     24 elif model_name == "inceptionresnetv2":

~\Anaconda3\lib\site-packages\keras\engine\network.py in get_layer(self, name, index)
    362         """Retrieves the model's updates.
    363 
--> 364         Will only include updates that are either
    365         unconditional, or conditional on inputs to this model
    366         (e.g. will not include updates that depend on tensors

ValueError: No such layer: custom

Я попытался удалить и переустановить Keras полностью.Также где-то я прочитал, чтобы включить в файл inceptionV3.py (в папке приложения keras) следующее:

from ..layers import Flatten

я добавил это в импорт.Все еще не повезло.Может кто-нибудь, пожалуйста, помогите мне в этом?Я новичок в Керасе.

1 Ответ

0 голосов
/ 03 декабря 2018

Хорошо ... Я думаю, что вы следуете этому учебнику , который, по моему мнению, был написан кем-то, кто на самом деле не самый лучший пользователь Keras.

Упомянутый пользовательский слойсозданный руководством, когда они изменяют исходный код keras (, пожалуйста, не делайте этого, это не безопасный способ работы и создаст проблемы в ваших будущих проектах )

Пользовательскийслой создан в этой части урока:

`Add in "<model>.py"


...
...
if include_top:
    # Classification block
    x = GlobalAveragePooling2D(name='avg_pool')(x)
    x = Dense(classes, activation='softmax', name='predictions')(x)
else:
    if pooling == 'avg':
        x = GlobalAveragePooling2D()(x)
    elif pooling == 'max':
        x = GlobalMaxPooling2D()(x)
    x = Flatten(name='custom')(x)
...

Комментарии:

  • Это абсолютно не нужно.Выходы из глобальных пулов уже сведены.
  • Это опасно для ваших будущих проектов, так как вы меняете исходный код keras.

Вы можете сделать то же самое, не создавая этот плоский слой, просто взяв последний слоймодель:

lastLayer = base_model.layers[-1]

Еще больше: если целевой слой последний, вам это не нужно.Просто используйте base_model как есть.

Если вы хотите получить полную модель со слоем Dense в конце, просто используйте include_top=True.

Если вам нужно произвольное количество классов, сообщите об этом конструктору модели.

Если вы хотите настоящий промежуточный слой, найдите имя слоя, позвонив по номеру model.summary().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...