使用 Tensorflow 识别错误分类的图像

Posted

技术标签:

【中文标题】使用 Tensorflow 识别错误分类的图像【英文标题】:Identify misclassified images with Tensorflow 【发布时间】:2021-06-17 21:20:10 【问题描述】:

我一直在研究图像分类器,我想看看模型在验证中错误分类的图像。我的想法是比较真实值和预测值,并使用不匹配值的索引来获取图像。 但是,当我尝试比较准确性时,我得到的结果与使用评估方法时得到的结果不同。 这就是我所做的:

我使用这个函数导入数据:

def create_dataset(folder_path, name, split, seed, shuffle=True):
  return tf.keras.preprocessing.image_dataset_from_directory(
    folder_path, labels='inferred', label_mode='categorical', color_mode='rgb',
    batch_size=32, image_size=(320, 320), shuffle=shuffle, interpolation='bilinear',
    validation_split=split, subset=name, seed=seed)

train_set = create_dataset(dir_path, 'training', 0.1, 42)
valid_set = create_dataset(dir_path, 'validation', 0.1, 42)

# output:
# Found 16718 files belonging to 38 classes.
# Using 15047 files for training.
# Found 16718 files belonging to 38 classes.
# Using 1671 files for validation.

然后为了评估验证集的准确性,我使用了这一行:

model.evaluate(valid_set)

# output:
# 53/53 [==============================] - 22s 376ms/step - loss: 1.1322 - accuracy: 0.7349
# [1.1321837902069092, 0.7348892688751221]

这很好,因为这些值与我在最后一个训练阶段得到的值完全相同。

为了从验证集中提取真正的标签,我使用基于 answer 的这行代码。请注意,我需要再次创建验证,因为每次我调用引用验证集的变量时,验证集都会被打乱。 我以为是这个因素导致了精度不一致,但显然并没有解决问题。

y_val_true = np.concatenate([y for x, y in create_dataset(dir_path, 'validation', 0.1, 42)], axis=0)
y_val_true = np.argmax(y_val_true, axis=1)

我做出预测:

y_val_pred = model.predict(create_dataset(dir_path, 'validation', 0.1, 42))
y_val_pred = np.argmax(y_val_pred, axis=1)

最后我再次计算准确性以验证一切正常:

m = tf.keras.metrics.Accuracy()
m.update_state(y_val_true, y_val_pred)
m.result().numpy()

# output:
# 0.082585275

如您所见,与运行评估方法时得到的值不同,现在我只得到 8%。

如果您能指出我的方法存在缺陷的地方,我将不胜感激。 自从我发布第一个问题以来,我提前为我犯的任何错误道歉。

【问题讨论】:

这能回答你的问题吗? ***.com/a/65346147/9215780 是和不是。这是我一直在尝试实施的相同方法,但在我的情况下,我需要从 tf 数据集中获取标签,并且当我尝试这样做时,标签会被打乱。结果,真实标签和预测标签不匹配。这就是为什么我得到不正确的准确度值。或者至少如果认为它正在发生的话。无论如何,非常感谢@M.Innat的回答 【参考方案1】:

如果您想逐批显示或分析,此方法有助于提供见解

m = tf.keras.metrics.Accuracy()

# Iterating over individual batches to keep track of the images
# being fed to the model.
for valid_images, valid_labels in valid_set.as_numpy_iterator():
    y_val_true = np.argmax(valid_labels, axis=1)

    # Model can take inputs other than dataset as well. Hence, after images
    # are collected you can give them as input.
    y_val_pred = model.predict(valid_images)
    y_val_pred = np.argmax(y_val_pred, axis=1)
   
    # Update the state of the accuracy metric after every batch
    m.update_state(y_val_true, y_val_pred)

m.result().numpy()

如果你想完全喂食

valid_ds = create_dataset(dir_path, 'validation', 0.1, 42, shuffle=False)
y_val_true = np.concatenate([y for x, y in valid_ds, axis=0)
y_val_true = np.argmax(y_val_true, axis=1)
y_val_pred = model.predict(valid_ds)
y_val_pred = np.argmax(y_val_pred, axis=1)

m = tf.keras.metrics.Accuracy()
m.update_state(y_val_true, y_val_pred)
m.result().numpy()

但我在您的代码中找不到错误。

【讨论】:

感谢您回答我的问题。您发布的第一段代码绝对解决了我的问题。我没有意识到我可以逐批计算准确性,这种方法克服了不匹配问题。关于第二种方法,不幸的是我已经测试过它并且它不起作用,因为我需要对数据集进行洗牌,否则我的表现会很差。此外,如果不使用 np.argmax,则需要使用 tf.keras.metrics.CategoricalAccuracy 才能正确测量准确度。再见,谢谢你 感谢您指出。我忘了加argmax。我在培训时了解shuffle 的问题,但是,验证时有什么问题?如果模型训练得很好,那么如果 shuffle 为 False,它的性能应该不会很差。 我完全同意你的观点,但由于某些原因我无法理解,这个过程不起作用。如果我使用shuffle=False 创建验证集,那么它只包含整个集中最后一个类的实例。我发现这个结果很奇怪,因为我为训练集保留了shuffle=True。我认为我实现代码的方式存在错误。

以上是关于使用 Tensorflow 识别错误分类的图像的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow最简单的图像搭建识别系统

利用深度学习框架Tensorflow做图像识别(基于阿里云PAI)

3分钟搭建图像识别系统|一份TensorFlow速成教程

想尝试搭建图像识别系统?这里有一份TensorFlow速成教程

tensorflow-彩色图像识别

TensorFlow 读取带有标签的图像