Python 使用ImageDataGenerator进行转移学习时出现形状不兼容错误
我想创建一个分类模型。为此,我从3个不同的班级收集了一些图片。首先,我实现了异常模型(冻结了除最后一层之外的所有层)。然而,它的安装过度了。然后,我决定使用数据扩充策略。这是我第一次使用Keras模块实现此目的。我相信我已经正确地使用了它。但是获取错误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
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))
谢谢你的帮助。它解决了问题。感谢你的帮助。它解决了这个问题。