Python 使用ImageDataGenerator进行转移学习时出现形状不兼容错误

Python 使用ImageDataGenerator进行转移学习时出现形状不兼容错误,python,keras,transfer-learning,data-augmentation,Python,Keras,Transfer Learning,Data Augmentation,我想创建一个分类模型。为此,我从3个不同的班级收集了一些图片。首先,我实现了异常模型(冻结了除最后一层之外的所有层)。然而,它的安装过度了。然后,我决定使用数据扩充策略。这是我第一次使用Keras模块实现此目的。我相信我已经正确地使用了它。但是获取错误ValueError:形状(无,无)和(无,无,无,3)不兼容。我试过从网上找到的东西,但没有成功。有人能指出我做错了什么吗?这是代码 from tensorflow import keras from matplotlib import pypl

我想创建一个分类模型。为此,我从3个不同的班级收集了一些图片。首先,我实现了异常模型(冻结了除最后一层之外的所有层)。然而,它的安装过度了。然后,我决定使用数据扩充策略。这是我第一次使用Keras模块实现此目的。我相信我已经正确地使用了它。但是获取错误
ValueError:形状(无,无)和(无,无,无,3)不兼容
。我试过从网上找到的东西,但没有成功。有人能指出我做错了什么吗?这是代码

from tensorflow import keras
from matplotlib import pyplot as plt
from keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.imagenet_utils import preprocess_input
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Activation
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.models import Model

# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

# this is the augmentation configuration we will use for testing:
# only rescaling
test_datagen = ImageDataGenerator(rescale=1./255)

# this is a generator that will read pictures found in
# subfolers of 'data/train', and indefinitely generate
# batches of augmented image data
train_generator = train_datagen.flow_from_directory(
        'data2/train',  # this is the target directory
        target_size=(299, 299),  # all images will be resized to 299x299 for the Xception
        batch_size=32,
        class_mode="categorical")  

# this is a similar generator, for validation data
validation_generator = test_datagen.flow_from_directory(
        'data2/validation',
        target_size=(299, 299),
        batch_size=32,
        class_mode="categorical")


Xception = keras.applications.Xception(weights='imagenet', include_top=False)
num_classes=3
inp = Xception.input
new_classification_layer = Dense(num_classes, activation='softmax')
out = new_classification_layer(Xception.layers[-2].output)
model_Xception = Model(inp, out)
model_Xception.summary()

for l, layer in enumerate(model_Xception.layers[:-1]):
    layer.trainable = False

for l, layer in enumerate(model_Xception.layers[-1:]):
    layer.trainable = True
    

opt=keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07)

model_Xception.compile(loss='categorical_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])

model_Xception.summary()

model_Xception.fit_generator(
        train_generator,
        epochs=5,
        validation_data=validation_generator)
model_Xception.save_weights('first_try.h5') 

这是因为您正在将卷积的输出馈送到密集层

为了将输出转换为
(批处理大小、输入大小)
,您需要添加一个
Flatten
globalExpooling2D
globalAveragePoolig2D
。您可以更改以下行:

inp = Xception.input
out_xception = Xception.layers[-2].output
flatten = tf.keras.layers.Flatten()(out_xception)
new_classification_layer = tf.keras.layers.Dense(num_classes, activation='softmax')
out = new_classification_layer(flatten)
model_Xception = tf.keras.Model(inp, out)
model_Xception.summary()
第二件事是,由于在定义异常模型时没有指定input_形状,所以Flatte将抛出一个错误。只需将其更改为:

Xception = tf.keras.applications.Xception(weights='imagenet', include_top=False,
                                          input_shape = (299,299,3))

这是因为您正在将卷积的输出馈送到密集层

为了将输出转换为
(批处理大小、输入大小)
,您需要添加一个
Flatten
globalExpooling2D
globalAveragePoolig2D
。您可以更改以下行:

inp = Xception.input
out_xception = Xception.layers[-2].output
flatten = tf.keras.layers.Flatten()(out_xception)
new_classification_layer = tf.keras.layers.Dense(num_classes, activation='softmax')
out = new_classification_layer(flatten)
model_Xception = tf.keras.Model(inp, out)
model_Xception.summary()
第二件事是,由于在定义异常模型时没有指定input_形状,所以Flatte将抛出一个错误。只需将其更改为:

Xception = tf.keras.applications.Xception(weights='imagenet', include_top=False,
                                          input_shape = (299,299,3))

谢谢你的帮助。它解决了问题。感谢你的帮助。它解决了这个问题。