Converting keras.applications.resnet50 to a Sequential gives error

青春壹個敷衍的年華 提交于 2020-01-16 18:01:12

问题


I want to convert pretrained ResNet50 model from keras.application to a Sequential model but it gives input_shape error.

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

I read this https://github.com/keras-team/keras/issues/9721 and as I understand the reason of error is skip_connections.

Is there a way to convert it to a Sequential or how can I add my custom model to end of this ResNet Model.

This is the code I've tried.

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)

I want to add this to end of it. Where can I start?

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:


Use functionl API of Keras.

First take 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))

And add module of your model as follows, and use output of ResNet to input of the next layer

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)

Add this way all of your layer and at last for example,

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

And, use Model() to create the final model.

model = Model(inputs=model_resnet.input, outputs=fc2)


来源:https://stackoverflow.com/questions/56004412/converting-keras-applications-resnet50-to-a-sequential-gives-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!