简体   繁体   中英

Why I am getting error while using ResNet50 for transfer learning?

So I am trying to use ResNet50 for transfer learning with my keras model(ie Trinity), but the problem is I am getting an error when I try to execute Trinity.fit(). Exact error "ValueError: Input 0 of layer sequential_8 is incompatible with the layer: expected ndim=4, found ndim=2. Full shape received: [None, 2048]"

What is the reason for this error? How can I solve it?

Here is the python code:

1)       from keras.models import Sequential
         from keras.layers import Conv2D,MaxPooling2D
         from keras.layers import Activation, Dense, Flatten, Dropout
         from keras.preprocessing.image import ImageDataGenerator
         import os

2)       import keras
         import wandb
         from wandb.keras import WandbCallback
         from keras.models import Sequential
         from keras.layers import Dense, Flatten
         from keras.applications.resnet50 import ResNet50, decode_predictions,preprocess_input
         import matplotlib.pyplot as plt


3)       training_dir = '../input/fruits/fruits-360/Training/'
         validation_dir = '../input/fruits/fruits-360/Test/'
         test_dir = '../input/fruits/fruits-360/test-multiple_fruits/'

4)       image_size = 224
         
         data_generator = ImageDataGenerator(preprocessing_function=preprocess_input)


        train_generator = data_generator.flow_from_directory(
                          '../input/fruits/fruits-360/Training/',
                           target_size=(image_size, image_size),
                           batch_size=24,
                           class_mode='categorical')

        validation_generator = data_generator.flow_from_directory(
                           '../input/fruits/fruits-360/Test/',
                           target_size=(image_size, image_size),
                           batch_size=24,
                           class_mode='categorical')
             #OUTPUT
             #[Found 67692 images belonging to 131 classes.
             #Found 22688 images belonging to 131 classes.]



5)           resnet_model = ResNet50(weights="imagenet")


6)           x_train_preprocessed = train_generator
             x_test_preprocessed =  validation_generator

7)           last_layer = resnet_model.get_layer("avg_pool")
             resnet_layers = keras.Model(inputs=resnet_model.inputs, outputs=last_layer.output)
             resnet_layers.summary()

8)           x_train_features = resnet_layers.predict(x_train_preprocessed)
             x_test_features = resnet_layers.predict(x_test_preprocessed)


9)           Trinity = Sequential()


             Trinity.add(Conv2D(filters = 16, kernel_size = 2,input_shape=(224,224,3),padding='same'))
             Trinity.add(Activation('relu'))
             Trinity.add(MaxPooling2D(pool_size=2))

             Trinity.add(Conv2D(filters = 32,kernel_size = 2,activation= 'relu',padding='same'))
             Trinity.add(MaxPooling2D(pool_size=2))

             Trinity.add(Conv2D(filters = 64,kernel_size = 2,activation= 'relu',padding='same'))
             Trinity.add(MaxPooling2D(pool_size=2))

             Trinity.add(Conv2D(filters = 128,kernel_size = 2,activation= 'relu',padding='same'))
             Trinity.add(MaxPooling2D(pool_size=2))

             Trinity.add(Dropout(0.3))
             Trinity.add(Flatten())

             Trinity.add(Dense(132))
             Trinity.add(Activation('relu'))

             Trinity.add(Dropout(0.4))

             Trinity.add(Dense(131,activation = 'softmax'))


             Trinity.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])

10)          Trinity.fit(x_train_features,epochs=50,validation_data=x_test_features)


#OUTPUT OF 7)

#OUTPUT OF 10)

you should add include_top=False to the instance of resnet, then add your model to the top of resnet. that way it should work. Here is an example:

base_model = ResNet50V2(include_top=False, weights="imagenet", input_shape=(224,224,3), pooling="avg")
base_model.summary()
model2 = Sequential()

model2.add(base_model)
model2.add(Dense(64, activation="relu"))
model2.add(Dropout(0.2))

model2.add(Dense(64, activation="relu"))
model2.add(Dropout(0.2))

model2.add(Dense(32, activation="relu"))
model2.add(Dropout(0.2))

model2.add(Dense(32, activation="relu"))
model2.add(Dropout(0.2))

model2.add(Dense(1, activation="sigmoid"))

base_model.trainable = False
model2.summary()
model2.compile(optimizer=Adam(), loss="binary_crossentropy", metrics=["accuracy"])

and here is another example from keras website: https://keras.io/examples/vision/image_classification_efficientnet_fine_tuning/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM