简体   繁体   English

为什么我在使用 ResNet50 进行迁移学习时会出错?

[英]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().因此,我尝试使用 ResNet50 与我的 keras 模型(即 Trinity)进行迁移学习,但问题是当我尝试执行 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]"确切错误“ValueError:层序 8 的输入 0 与层不兼容:预期 ndim=4,发现 ndim=2。收到完整形状:[无,2048]”

What is the reason for this error?这个错误的原因是什么? How can I solve it?我该如何解决?

Here is the python code:这是 python 代码:

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) #输出 7)

#OUTPUT OF 10) #输出 10)

you should add include_top=False to the instance of resnet, then add your model to the top of resnet.您应该将 include_top=False 添加到 resnet 的实例中,然后将您的 model 添加到 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/这是 keras 网站的另一个示例: https://keras.io/examples/vision/image_classification_efficientnet_fine_tuning/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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