首页 > 解决方案 > 使用列表和生成器预测 CNN 模型

问题描述

我有两个 CNN 架构,model_a并且model_b. 首先,我使用 中的验证集来预测结果model_a。这非常有效,只需不到 20 秒。

问题在于尝试使用model_b. 棘手的是我只想预测model_a预测为猫的图像。为此,我从 的预测中读取标签, model_a如果它是“猫”标签,我将相应的图像插入到列表中list_pred_cat

但是,当我尝试model_b使用它进行预测时,list_pred_cat它需要很长时间才能运行(我在 10 分钟后停止计数)需要比 更长的时间model_a,这没有意义,因为它要预测的图像更少。会不会是因为没有使用发电机?我能做些什么来解决这个问题?

PS:虽然它永远不会返回错误。

这是我的代码:

val_generator = val_dataGen.flow_from_directory(directory="./model_a/model_a/val_pad_cc",
                                                    class_mode="categorical",
                                                    batch_size=32,
                                                    shuffle = False, seed = 2)

val_generator.reset()

#loads model_a's weights
model_a.load_weights('/content/Best_weigths_DenseNet121_model_a_teste6.h5')

#predicts model_a results using generators
pred_a=model_a.predict(val_generator)
y_pred_a = np.argmax(pred_a, axis=1)

#Code to transform val_generator into the list x_val
x_val=[]
for i in range(159):
    a , b = val_generator.next()
    x_val.extend(a)

#creates a list containing only the images predicted as cats by model_a
for i in range(5069):
    #label=cat
    if(y_pred_a[i]==0): 
        list_pred_cats.extend(x_val[i])

#loads model_b's weights
model_b.load_weights('/content/Best_weigths_DenseNet121_model_b_teste6.h5')

pred_b=model_b.predict(list_pred_cats)

编辑:我认为您还需要我如何制作模型:

def create_Densenet(no_classes):
    Resnet = DenseNet121(include_top=False, weights='imagenet', input_shape=(224, 224, 3))
    model = tf.keras.Sequential(Resnet)
    model.add(tf.keras.layers.GlobalAveragePooling2D())
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(units=no_classes, activation="softmax"))

    return model

model_a=create_Densenet(2)
model_b=create_Densenet(2)

EDIT2:如果我尝试将 x_val[0](只是第一张图像)放在 list_pred_cat( pred_b=model_b.predict(x_val[0], verbose=1)) 的位置,它会给我以下错误:

ValueError: Input 0 is incompatible with layer sequential_2: expected shape=(None, 224, 224, 3), found shape=(32, 256, 3)

标签: pythontensorflowconv-neural-network

解决方案


你在生成器中有一个 32 的批量大小,在循环中你接下来会得到 254 个批次,所以 32 X 254 = 8128 个图像在 x_val 中。所以你然后使用模型 a 预测 8128 张图像。然后,您仅迭代 5069 个预测,如果预测标签为 0,则将图像存储在 list_pred_cats 中。这一切看起来都是正确的。list_pred_cats 的形状是什么?如果大约一半的图像是猫,它将是大约 2500 张图像。这些不是由发电机提供的。您没有在 model.predict 中设置批量大小,因此它默认为 32。因此它需要 2500/32 步才能完成,大约为 78。当您运行 model.predict 时设置详细 = 1。您应该会看到一个进度条,它可以帮助您了解正在发生的事情。


推荐阅读