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

2024-06-14 09:03:23 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我尝试使用ResNet50对我的keras模型(即Trinity)进行迁移学习,但问题是,当我尝试执行Trinity.fit()时,出现了一个错误。 精确错误“ValueError:layer sequential_8的输入0与层不兼容:预期ndim=4,发现ndim=2。收到完整形状:[None,2048]”

这个错误的原因是什么?我怎样才能解决它

以下是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)


#7)的产出

#输出10)


Tags: fromtestimageimportaddinputsizelayers
1条回答
网友
1楼 · 发布于 2024-06-14 09:03:23

您应该将include_top=False添加到resnet的实例中,然后将您的模型添加到resnet的顶部。这样应该行得通。以下是一个例子:

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"])

下面是keras网站的另一个例子:https://keras.io/examples/vision/image_classification_efficientnet_fine_tuning/

相关问题 更多 >