add layers into keras pretrained model

Viewed 3857

I'm trying to build a ResNet50 CNN for image classification into 5 different classes. I start by importing this model:

ResNet = ResNet50(
    include_top= None, weights='imagenet', input_tensor=None, input_shape=([128, 217, 3]),
    pooling=None, classes=5)

And then I try to add some final layers for the classification:

ResNet.add(Flatten())
ResNet.add(Dense(units=512, activation='relu'))
ResNet.add(Dropout(0.5))
ResNet.add(Dense(units=256, activation='relu'))
ResNet.add(Dropout(0.5))
ResNet.add(Dense(units=5, activation='softmax'))

But when I try this I get an error that says:

AttributeError: 'Functional' object has no attribute 'add'

Does anybody know how to fix this? Or how should I try to add the layers?

2 Answers

You should do the following:

from tensorflow.keras import models

ResNet = ResNet50(
    include_top= None, weights='imagenet', input_tensor=None, input_shape=([128, 217, 3]),
    pooling=None, classes=5)
model = models.Sequential()
model.add(ResNet)
model.add(Flatten())
model.add(Dense(units=512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(units=256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(units=5, activation='softmax'))

The syntax you used is part of the Sequential() module.

This is because your model is not sequential.

You must do either :

last_layer = ResNet.output

x = Flatten()(last_layer)
x = Dense(units=512, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(units=256, activation='relu')(x)
x = (Dropout(0.5)(x)
x = Dense(units=5, activation='softmax')(x)

# prevent the weights from being updated during training
ResNet.trainable = False

model = Model(inputs=ResNet.input, outputs=x)

either use Sequential mode:

ResNet_load = ResNet50(
    include_top= None, weights='imagenet', input_tensor=None, input_shape=([128, 217, 3]),
    pooling=None, classes=5)

Resnet = Sequential()
ResNet.add(ResNet_load)
ResNet.add(Flatten())
ResNet.add(Dense(units=512, activation='relu'))
ResNet.add(Dropout(0.5))
ResNet.add(Dense(units=256, activation='relu'))
ResNet.add(Dropout(0.5))
ResNet.add(Dense(units=5, activation='softmax'))

Sequential model

Functional API

Related