ValueError: 检查输入时出错:期望flatten_1_input的形状为(4, 4, 512),但得到的数组形状为(128, 128, 3)

我在处理图像分类问题时使用了以下代码,并且不断遇到这个错误:

ValueError: Error when checking input: expected flatten_1_input to have shape (4, 4, 512) but got array with shape (128, 128, 3)

我看到过类似的问题,是因为某人错误地加载了模型,但我并没有这样做。以下是我的代码:

def save_bottlebeck_features():
    datagen = ImageDataGenerator(rescale=1. / 255)
    
    # 构建VGG16网络
    model = applications.VGG16(include_top=False, weights='imagenet')
    
    generator = datagen.flow_from_directory(
            train_data_dir,
            target_size=(img_width, img_height),
            batch_size=batch_size,
            class_mode=None,
            shuffle=False)
    bottleneck_features_train = model.predict_generator(
            generator, nb_train_samples // batch_size)
    np.save('bottleneck_features_train.npy', bottleneck_features_train)
    
    generator = datagen.flow_from_directory(
            validation_data_dir,
            target_size=(img_width, img_height),
            batch_size=batch_size,
            class_mode=None,
            shuffle=False)
    bottleneck_features_validation = model.predict_generator(
            generator, nb_validation_samples // batch_size)
    np.save('bottleneck_features_validation.npy',bottleneck_features_validation)

def train_top_model():
    train_data = np.load('bottleneck_features_train.npy',"r+")
    train_labels = np.array([0] * (nb_train_samples // 2) + [1] * (nb_train_samples // 2))
    validation_data = np.load('bottleneck_features_validation.npy',"r+")
    validation_labels = np.array([0] * (nb_validation_samples // 2) + [1] * (nb_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('my_model.model')

save_bottlebeck_features()
train_top_model()

from keras.preprocessing import image
import numpy as np
from keras.models import load_model
import os

resnet_50 = load_model("my_model.model")
TEST_DIR = 'test/'
with open('better_score.csv','w') as f:
    f.write('Id,Expected\n')
    for x in range(1,7091):
         mystr = "test_" + str(x) +".jpg"
        path = os.path.join(TEST_DIR, mystr)
        if (os.path.exists(path)):
            img = image.load_img(path, target_size=(128, 128))
            img = image.img_to_array(img)
            img = np.expand_dims(img, axis=0)
            model_out  = resnet_50.predict(img/255)
            f.write('{},{}\n'.format(mystr, model_out[0][0]))

我已经打印了train_data的形状,结果是(2000, 4, 4, 512),而validation_data的形状是(800, 4, 4, 512)。我能够训练我的模型并保存它。问题发生在倒数第二行,当我试图将结果输出到CSV文件时。


回答:

您首先需要使用VGG模型提取输入图像的特征,然后将这些特征传递给resnet_50模型。看起来应该是这样的:

model = applications.VGG16(include_top=False, weights='imagenet')
features = model.predict(img/255.0)
model_out = resnet_50.predict(features)

请记住,您的resnet_50模型的输入是通过VGG模型获得的图像特征。

Related Posts

多维度Top-k评分

例如,在机器学习中的自然语言处理中,通常使用波束搜索来…

R – Caret train() “错误:停止” 与 “在newdata中未找到对象中使用的所有变量名”

我正在尝试为蘑菇数据构建一个简单的朴素贝叶斯分类器。我…

创建训练和测试数据集分割,数据嵌套在多个文件夹中

我正在准备数据以训练一个图像识别模型。目前我有一个文件…

我的神经网络预测出现错误:IndexError: list index out of range

我正在进行一个简单的垃圾邮件/非垃圾邮件文本分类。我的…

python 给出数组是一维的,但索引了两个维度错误

我已经为 miniBatchGradientDesce…

TensorFlow自定义训练步骤使用不同的损失函数

背景 根据TensorFlow文档,可以使用以下方式执…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注