如何在Keras的predict_generator()中获取关联图像名称?
解决方法:先修正shuffle参数,再获取测试图像名称
首先,你遇到的每次预测结果不同的问题,根源在于shuffle参数的取值错误——你传入的是字符串 "false",但Keras的flow_from_directory里的shuffle参数需要的是布尔值False(小写,不带引号)。在Python中,非空字符串会被视为True,所以你的设置其实相当于开启了打乱机制,导致每次运行都会随机选取图片。
先把代码里的shuffle = "false"改成shuffle=False,这样generator就会按目录下的固定顺序读取图片,每次steps=1时都会取第一张图。
接下来,要查看当前测试的图像名称,有两种简单可靠的方法:
方法一:直接通过generator属性定位文件名
flow_from_directory生成的test_batches对象自带filenames属性,它是一个按读取顺序排列的所有测试图片文件名的列表。当你设置steps=1且shuffle=False时,第一次预测的就是列表里的第一个元素:
# 修正shuffle参数为布尔值False test_batches = ImageDataGenerator(preprocessing_function=preprocess_input).flow_from_directory( test_path, target_size=(224,224), batch_size=1, class_mode=None, shuffle=False ) # 获取当前要测试的图片名称 current_image = test_batches.filenames[0] print(f"当前测试的图片是:{current_image}") # 执行预测 prediction = model.predict_generator(test_batches, steps=1, verbose=1) print(np.argmax(prediction))
方法二:迭代generator动态获取当前batch的文件名
如果你后续需要测试多张图片,想要动态获取每次迭代对应的文件名,可以直接用next()方法获取batch数据和对应的文件名:
test_batches = ImageDataGenerator(preprocessing_function=preprocess_input).flow_from_directory( test_path, target_size=(224,224), batch_size=1, class_mode=None, shuffle=False ) # 获取一个batch的图片数据与文件名 batch_data, batch_filenames = next(test_batches) print(f"当前测试的图片是:{batch_filenames[0]}") # 用该batch执行预测 prediction = model.predict(batch_data, verbose=1) print(np.argmax(prediction))
这样就能准确知道每次预测的是哪张图片,同时也解决了每次选图不同的问题。
内容的提问来源于stack exchange,提问作者Asymptote
相关产品推荐
相关产品推荐

