我有一个用于图像分类的标准CNN,使用以下生成器来获取数据集:
generator = validation_image_generator.flow_from_directory(batch_size=BATCH_SIZE,
directory=val_dir,
shuffle=False,
target_size=(100,100),
class_mode='categorical')
我可以轻松地通过以下方式获得预测标签:
predictions = model.predict(dataset)
现在,我想获取所有预测的(原始)真实标签和图像,以与预测相同的顺序进行比较。我确信信息可以很容易地存储在某个地方,但是我找不到它。
答案 0 :(得分:1)
您必须从数据生成器获取图像并将其提供给model.predict。 如果image_gen是您的ImageDataGenerator,那么您可以使用:
X,y = image_gen.next()
prediction = model.predict(X)
现在X是您的图像(例如,批处理X [0]是第一个图像,X [1]是第二个图像,依此类推),y是它们的相应标签,而预测是您为每个图像输出的模型。 / p>
这将从ImageDataGenerator提供一批,并显示X,y和预测。要在整个时期内运行它,必须使用for循环:
for step in range(step_per_epoch):
X, y = image_gen.next()
prediction = model.predict(X)
其中step_per_epoch应该为dataset_size / batch_size。
,但请记住ImageDataGenerators是随机工作的。因此,如果您有100张图像且批处理大小为10,则如果从ImageDataGenerator提取10个批次,则可能会看到两次图像,而不会看到其他图像。
答案 1 :(得分:0)
您想一次获得真实的标签,图像和预测。可以类似于documentation中的示例进行此操作:
# here's a more "manual" example
for e in range(epochs):
print('Epoch', e)
batches = 0
for x_batch, y_batch in datagen.flow(x_train, y_train, batch_size=32):
model.fit(x_batch, y_batch)
batches += 1
if batches >= len(x_train) / 32:
# we need to break the loop by hand because
# the generator loops indefinitely
break
以上是一个训练循环,您可以对其进行调整以轻松获得测试评估循环,例如:
for x_val, y_val in generator().flow_from_directoy(...):
y_pred = model.predict(x_val)
score = your_score_func(y_pred,y_val)