Преобразование VGG19 в ResNet в Керасе

У меня есть следующий код, который работает с предварительно обученной моделью VGG, но не работает в модели ResNet и Inception.

vgg_model = keras.applications.vgg16.VGG16(weights='imagenet')
type(vgg_model)
vgg_model.summary()
model = Sequential()
for layer in vgg_model.layers:
    model.add(layer)

Теперь изменим модель на ResNet следующим образом:

resnet_model=keras.applications.resnet50.ResNet50(weights='imagenet')
type(resnet_model)
resnet_model.summary()
model = Sequential()
for layer in resnet_model.layers:
    model.add(layer)

дает следующую ошибку:

ValueError: Input 0 is incompatible with layer res2a_branch1: expected axis -1 of input shape to have value 64 but got shape (None, 56, 56, 256)

person Karan Arya    schedule 12.08.2019    source источник
comment
Почему вы хотите преобразовать предварительно обученную модель в последовательную?   -  person Dr. Snoopy    schedule 12.08.2019
comment
Если ответ решил вашу проблему, пожалуйста, примите его, нажав на галочку (✔) рядом с ответом, чтобы отметить его как ответ - см. Что мне делать, если кто-то ответит на мой вопрос?   -  person today    schedule 25.04.2020


Ответы (1)


Проблема связана с тем, что в отличие от VGG, Resnet не имеет последовательной архитектуры (например, некоторые уровни связаны с более чем одним слоем, есть пропускаемые соединения и т. Д.). Поэтому вы не можете перебирать слои в модели один за другим и соединять каждый слой с предыдущим (то есть последовательно). Вы можете построить архитектуру модели, используя plot_model(), чтобы лучше понять этот момент.

person today    schedule 12.08.2019
comment
@KaranArya Как я уже упоминал, нет способа преобразовать непоследовательную модель в последовательную модель. И я не уверен, почему вам это интересно. Но, если вы объясните свою конечную цель, возможно, мы сможем вам лучше помочь. - person today; 12.08.2019
comment
Моя конечная цель - запустить мультиклассовую классификацию с помощью ResNet. - person Karan Arya; 15.08.2019
comment
@KaranArya Итак, вам не нужно преобразовывать ResNet в последовательную модель для этого. Просто используйте его как есть (возможно, вам также нужно добавить пользовательские слои поверх). См. это руководство ( в частности, его последний раздел: Тонкая настройка верхних слоев предварительно обученной сети). - person today; 15.08.2019