python - 使用 model.predict() 的错误预测
问题描述
我在迁移学习的 VGG16 网络中进行预测时遇到问题。我有一个与亚当一起训练了 7 节课的模型。它是用 fit_generator() 训练的,使用 ImageDataGenerator。我正在使用以下方法加载模型:
# load the model we saved
model = load_model('models/vgg16_9.h5')
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.Adam(lr=1e-4),
metrics=['acc'])
然后试图做出预测。首先,我使用 predict_generator() 制作了一个带有结果的 .CSV 文件:
test_datagen = ImageDataGenerator(rescale = 1./255)
test_generator = test_datagen.flow_from_directory("dataset/test_set",
target_size=(227, 454),
batch_size=1,
class_mode=None,
shuffle=False,
seed=42)
test_generator.reset()
pred = model.predict_generator(test_generator, verbose = 1)
predicted_class_indices = np.argmax(pred, axis = 1)
labels = (valid_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
filenames=test_generator.filenames
results=pd.DataFrame({"Filename":filenames,
"Predictions":predictions})
results.to_csv("results.csv",index=False)
它工作正常,我得到如下结果:
...
Filename,Predictions
test\green.1191.png,Green
test\green.1195.png,Green
test\green.1196.png,Green
test\green.1197.png,Green
test\green.1198.png,OK
test\green.1199.png,Green
test\green.1200.png,Green
test\green.1201.png,Green
test\green.1202.png,OK
test\green.1203.png,Green
test\green.1204.png,OK
test\green.1205.png,Green
test\green.1206.png,Green
test\green.1207.png,Green
...
但是当我尝试使用以下方法进行单个图像预测时:
# predicting images
test_image = image.load_img('dataset/test_set/test/green.1230.png', target_size = (227, 454))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = model.predict(test_image, verbose=1)
y_pred = np.argmax(result, axis = 1)
我的 y_pred 是 [6],如果我正确阅读 class_indices [6],则完全是其他类(predict_generator() 做得很好)。
类索引:
class_names = (valid_generator.class_indices)
class_names = dict((v,k) for k,v in class_names.items())
class_names_list = []
temp = []
for key, value in class_names.items():
temp = value
class_names_list.append(temp)
给我:
{0: 'Green', 1: 'Half', 2: 'Moldy', 3: 'NoEmbryo', 4: 'OK', 5: 'Organic', 6: 'Stones'}
我究竟做错了什么?
解决方案
您的问题可能源于 python dict 到列表转换。当您的预测来自 predict_generator() 时,它会通过 key 从 dict 中进行选择。
在第二个示例中,您将其转换为列表并使用列表的索引,这将是完全不同的结果。
我真的不明白这样做的目的是什么:
for key, value in class_names.items():
temp = value
class_names_list.append(temp)
但是如果你从 class_names_list 中得到类结果,你会得到错误的结果。所以:
y_pred = np.argmax(result, axis = 1)
class_names[y_pred]
应该给你正确的价值。
推荐阅读
- r - 用 NA 替换字符 ""
- python - 在对象检测中从视频帧中获取 x 和 y 坐标的最小值
- unity3d - 在 Unity 中旋转地球,同时保持正确的方向
- python - 如何创建下载 API 以使用 python 烧瓶下载文件
- python-3.x - django.db.utils.IntegrityError:关系“units_unit”的“extra”列中的空值违反非空约束
- java - 与 SQL 相比,springboot JPA 非常慢
- sql - 我的金额太大了,不可能一次全部完成吗?
- filter - 如何结合自定义过滤器功能、自定义 selectSource 和动态表格填充?
- php - 我想在 centOS 6.10 和 CentOS 7 上将 PHP 5.6.4 升级到 PHP 7.4
- robotframework - RobotFramework 运行单个关键字