python - 使用列表和生成器预测 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)
解决方案
你在生成器中有一个 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。您应该会看到一个进度条,它可以帮助您了解正在发生的事情。