Python ValueError:检查时出错:预期展平_1_输入具有形状(无、4、4、512),但获得具有形状(1、150、150、3)的数组

Python ValueError:检查时出错:预期展平_1_输入具有形状(无、4、4、512),但获得具有形状(1、150、150、3)的数组,python,machine-learning,neural-network,deep-learning,keras,Python,Machine Learning,Neural Network,Deep Learning,Keras,我按照上的指南构建模型,并在微调部分之前停止,使用以下代码在其他一些图像上测试模型: img_width, img_height = 150, 150 batch_size = 1 test_model = load_model('dog_cat_model.h5') validation_data_dir = "test1" test_datagen = ImageDataGenerator(rescale=1. / 255) validation_generator = test_d

我按照上的指南构建模型,并在微调部分之前停止,使用以下代码在其他一些图像上测试模型:

img_width, img_height = 150, 150
batch_size = 1

test_model = load_model('dog_cat_model.h5')

validation_data_dir = "test1"

test_datagen = ImageDataGenerator(rescale=1. / 255)

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    shuffle=False,
    class_mode='binary')

predictions = test_model.predict_generator(validation_generator, len(validation_generator.filenames));

for i in range(len(validation_generator.filenames)):
    print(validation_generator.filenames[i], ": ", predictions[i])
但我得到了以下错误:

ValueError: Error when checking : expected flatten_1_input to have shape (None, 4, 4, 512) but got array with shape (1, 150, 150, 3)
打印test_model.summary提供以下输出:

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
flatten_1 (Flatten)          (None, 8192)              0
_________________________________________________________________
dense_1 (Dense)              (None, 256)               2097408
_________________________________________________________________
dropout_1 (Dropout)          (None, 256)               0
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 257
=================================================================
Total params: 2,097,665
Trainable params: 2,097,665
Non-trainable params: 0
_________________________________________________________________
None
我不知道如何理解这意味着什么

以下是我用于创建模型的代码:

img_width, img_height = 150, 150
top_model_weights_path = 'bottleneck_fc_model.h5'
train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
batch_size = 16
train_samples = 2000
validation_samples = 800
epochs = 50


def save_bottlebeck_features():
    datagen = ImageDataGenerator(rescale=1. / 255)

    # build the VGG16 network
    model = applications.VGG16(include_top=False, weights='imagenet')

    train_generator = datagen.flow_from_directory(
        train_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode=None,
        shuffle=False)

    validation_generator = datagen.flow_from_directory(
        validation_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode=None,
        shuffle=False)

    predict_size_train = int(math.ceil(train_samples / batch_size))

    bottleneck_features_train = model.predict_generator(train_generator, predict_size_train)
    np.save('bottleneck_features_train.npy', bottleneck_features_train)

    predict_size_validation = int(math.ceil(validation_samples / batch_size))

    bottleneck_features_validation = model.predict_generator(validation_generator, predict_size_validation)
    np.save('bottleneck_features_validation.npy', bottleneck_features_validation)


def train_top_model():
    train_data = np.load('bottleneck_features_train.npy')
    train_labels = np.array([0] * (train_samples // 2) + [1] * (train_samples // 2))

    validation_data = np.load('bottleneck_features_validation.npy')
    validation_labels = np.array([0] * (validation_samples // 2) + [1] * (validation_samples // 2))

    model = Sequential()
    model.add(Flatten(input_shape=train_data.shape[1:]))
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1, activation='sigmoid'))

    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])

    model.fit(train_data, train_labels,
              epochs=epochs,
              batch_size=batch_size,
              validation_data=(validation_data, validation_labels))

    model.save_weights(top_model_weights_path)
    model.save('dog_cat_model.h5')


save_bottlebeck_features()
train_top_model()

我希望有人能帮助我:)

尝试用GlobalAveragePoolig2D或GlobalMapooling2D替换扁平层

您在这一行中混合了bootleneck和图像模型逻辑:

test_model.predict_generator(...)
将图像馈送到瓶颈模型的位置。这导致形状错误。

添加

data_format='channels_last' 
model.add()中

如果后端使用Tensorflow,则将正常工作,并且

data_format='channels_first' 

如果后端正在使用theano

像这样的?它说序列模型中的第一层必须有输入形状,但我不理解它所需要的参数:
model.add(globalaveragepoolg2d(data\u format=None,input\u shape=(batch\u size,,,,,,,,?)
替换模型。用模型添加(flatte(input\u shape=train\u data.shape[1:])。添加(globalaveragepoolog2d(input\u shape=train\u data.shape[1:]))我得到了一个类似的错误:
ValueError:check时出错:预期全局\u average\u pooling2d\u 1\u输入具有形状(无,4,4,512),但获得了具有形状(1,150,150,3)的数组。
change model.fit(train\u数据,train\u标签,epochs=epochs,batch\u size=batch\u大小,validation\u数据=(validation\u数据,validation\u标签))和model.fit(瓶颈\u特征\u序列,序列\u标签,年代=年代,批量大小=批量大小,验证\u数据=(瓶颈\u特征\u验证,验证\u标签))你能打印出
validation\u数据吗
?很抱歉,我不知道如何在注释中正确设置格式:)-我将把它放在原始帖子中。这就是为什么-in line
predicts=test\u model.predict\u generator(validation\u generator,len(validation\u generator.filename))
您正在向
瓶颈
模型馈送图像。能否详细说明您的解决方案?