【问题标题】:Prediction on CNN model using lists and generators使用列表和生成器预测 CNN 模型
【发布时间】:2023-03-27 23:15:01
【问题描述】:

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

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

但是,当我尝试使用 list_pred_cat 预测 model_b 时,运行时间(我在 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)

【问题讨论】:

  • 既然没有错误,你有没有试过用GPU来运行它?
  • 看看它是否加快了进程并给你一个结果或返回某种错误。
  • 我正在使用他们的 GPU 在 COLAB 平台上运行程序。
  • 尝试使用较小的网络,以便调试。请注意,如果您并行运行两个模型,这可能会减慢执行速度,因为两个模型之间共享资源。
  • 介意分享您的 h5 文件吗?也许我可以试试

标签: python tensorflow conv-neural-network


【解决方案1】:

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

【讨论】:

  • 哦,这是一个错字。我也在我的代码中更正了它。但这并没有改变任何东西。 list_pred_cat 不是它应该的大小!我没有注意到这一点。它应该在 2500 左右,它是 1297664。x_val是 5069,所以这部分是正确的。所以这意味着 list_pred_cat 的创建是错误的。但是我该如何纠正呢? @Gerry P
  • 尝试用 append 替换 extend
  • 它不起作用。错误是:ValueError: Layersequential_1 需要 1 个输入,但它接收到 3523 个输入张量。收到的输入:[, , ,(...)
猜你喜欢
  • 2018-12-13
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 2021-11-08
  • 2011-08-11
  • 2018-12-14
相关资源
最近更新 更多