【发布时间】:2023-03-27 23:15:01
【问题描述】:
我有两个 CNN 架构,model_a 和 model_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