Преобразование keras.applications.resnet50 в последовательный файл дает ошибку - PullRequest
0 голосов
/ 06 мая 2019

Я хочу преобразовать предварительно обученную модель ResNet50 из keras.application в последовательную модель, но она выдает ошибку input_shape.

Вход 0 несовместим со слоем res2a_branch1: ожидаемая ось -1 формы ввода будет иметь значение 64, но получила форму (Нет, 25, 25, 256)

Я прочитал это https://github.com/keras-team/keras/issues/9721 и, как я понимаю, причина ошибки - skip_connections.

Есть ли способ преобразовать его в последовательный или как добавить свою пользовательскую модель в конец этой модели ResNet.

Это код, который я пробовал.

from keras.applications import ResNet50

height = 100 #dimensions of image
width = 100
channel = 3 #RGB

# Create pre-trained ResNet50 without top layer
model = ResNet50(include_top=False, weights="imagenet", input_shape=(height, width, channel))
# Get the ResNet50 layers up to res5c_branch2c
model = Model(input=model.input, output=model.get_layer('res5c_branch2c').output)

model.trainable = False
for layer in model.layers:
    layer.trainable = False

model = Sequential(model.layers)

Я хочу добавить это в конец. С чего начать?

model.add(Conv2D(32, (3,3), activation = 'relu', input_shape = inputShape))
model.add(MaxPooling2D(2,2))
model.add(BatchNormalization(axis = chanDim))
model.add(Dropout(0.2))

model.add(Conv2D(32, (3,3), activation = 'relu'))
model.add(MaxPooling2D(2,2))
model.add(BatchNormalization(axis = chanDim))
model.add(Dropout(0.2))

model.add(Conv2D(64, (3,3), activation = 'relu'))
model.add(MaxPooling2D(2,2))
model.add(BatchNormalization(axis = chanDim))
model.add(Dropout(0.2))

model.add(Flatten())

model.add(Dense(64, activation = 'relu'))
model.add(BatchNormalization(axis = chanDim))
model.add(Dropout(0.5))
model.add(Dense(classes, activation = 'softmax'))

1 Ответ

1 голос
/ 06 мая 2019

Используйте API-интерфейс Keras.

Сначала возьми ResNet50,

from keras.models import Model
from keras.applications import ResNet50

height = 100 #dimensions of image
width = 100
channel = 3 #RGB

# Create pre-trained ResNet50 without top layer
model_resnet = ResNet50(include_top=False, weights="imagenet", input_shape=(height, width, channel))

И добавьте модуль вашей модели следующим образом, и используйте выход ResNet для ввода следующего слоя

conv1 = Conv2D(32, (3,3), activation = 'relu')(model_resnet.output)
pool1 = MaxPooling2D(2,2)(conv1)
bn1 = BatchNormalization(axis=chanDim)(pool1)
drop1 = Dropout(0.2)(bn1)

Добавьте сюда все слои и, наконец, например,

flatten1 = Flatten()(drop1)
fc2 = Dense(classes, activation='softmax')(flatten1)

И, используйте Model() для создания окончательной модели.

model = Model(inputs=model_resnet.input, outputs=fc2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...