Вход 0 несовместим со слоем global_average_pooling2d_4: ожидалось ndim = 4, обнаружена ошибка ndim = 2

Я пытаюсь настроить модель VGG16. Я удалил последние 5 слоев

(*block5_pool (MaxPooling2D),flatten(Flatten),fc1 (Dense),fc2 (Dense),predictions (Dense)*). 

Теперь я хочу добавить уровень глобального среднего пула, но получаю эту ошибку

Вход 0 несовместим со слоем global_average_pooling2d_4: ожидалось ndim = 4, найдено ndim = 2 **

в чем, кажется, проблема?

model = VGG16(weights='imagenet', include_top=True)
model.layers.pop()
model.layers.pop()
model.layers.pop()
model.layers.pop()
model.layers.pop()
x = model.output
x = GlobalAveragePooling2D()(x)

person Umair Javaid    schedule 14.08.2019    source источник
comment
слой глобального среднего пула, да, он должен быть также 4d, как и другие слои, и у вас есть 2d вход для него   -  person snamef    schedule 14.08.2019


Ответы (1)


Если вы хотите удалить последние четыре слоя, просто используйте include_top=False. Далее, используйте pooling='avg', чтобы добавить GlobalAveragePooling2D слой в качестве последнего слоя:

model = VGG16(weights='imagenet', include_top=False, pooling='avg')

Примечание о том, почему ваше исходное решение не работает: как уже было предложено в этом ответе, вы не можете использовать метод pop() для layers атрибут моделей для удаления слоя. Вместо этого вам нужно напрямую ссылаться на их вывод (например, model.layers[-4].output), а затем передавать их другим слоям, если вы хотите добавить новые соединения.

person today    schedule 14.08.2019