【问题标题】:Having problems while doing multiclass classification with tensorflow使用 tensorflow 进行多类分类时遇到问题
【发布时间】:2020-10-03 06:47:25
【问题描述】:

https://colab.research.google.com/drive/1EdCL6YXCAvKqpEzgX8zCqWv51Yum2PLO?usp=sharing

你好,

在上面,我正在尝试使用 tensorflow 在牙科 X 光片上识别 5 种不同类型的修复体。我正在使用official documentation 来执行这些步骤,但现在我有点卡住了,我需要帮助。这是我的问题:

1-我的数据在我的本地磁盘上。上面链接上的 TF 示例从不同的存储库下载数据。当我想测试我的图像时,除了使用下面的代码之外,我还有其他方法吗?:

import numpy as np
from keras.preprocessing import image

from google.colab import files
uploaded = files.upload()

# predicting images
for fn in uploaded.keys():
  path = fn
  img = image.load_img(path, target_size=(180, 180))
  x = image.img_to_array(img)
  x = np.expand_dims(x, axis=0)

  images = np.vstack([x])
  classes = model.predict(images)
  print(fn)
  print(classes)

我问这个是因为官方文档只是显示了逐个测试图像的方法,如下所示:

img = keras.preprocessing.image.load_img(
sunflower_path, target_size=(img_height, img_width)
)
img_array = keras.preprocessing.image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0) # Create a batch

predictions = model.predict(img_array)
score = tf.nn.softmax(predictions[0])

print(
"This image most likely belongs to {} with a {:.2f} percent confidence."
.format(class_names[np.argmax(score)], 100 * np.max(score))
)

2- 我正在使用“image_dataset_from_directory”方法,所以我没有单独的验证目录。那样可以么 ?还是我应该使用 ImageDataGenerator ?为了测试我的数据,我手动从所有 5 个类别中随机挑选了一些数据,并将它们放入我的测试文件夹中,该文件夹有 5 个子文件夹,因为我有那个数量的类别。这是我应该做的预测,还将测试数据分成不同的文件夹吗?如果是,我如何在测试时同时加载所有这 5 个文件夹?

3- 我还应该创建混淆矩阵。但我不明白如何将this 应用于我的代码?其他人说,使用 scikit-learn 的 confusion matrix,但这次我必须定义 y-true、y_pred 值,我无法将其放入此代码中。我应该为 5 个不同的预测评估 5 个不同的混淆矩阵吗?如何?

4-有时,我观察到验证准确度开始远高于训练准确度。这不寻常吗?在 3-4 个 epoch 之后,训练准确度会达到验证准确度,并以更平衡的方式继续。我认为这不应该发生。一切都好吗?

5- 最后一个问题,为什么第一个 epoch 比其他 epoch 需要更长的时间?在我的设置中,完成第一个 epoch 大约需要 30-40 分钟,然后每隔一个 epoch 只需大约一分钟左右。有没有办法解决它还是总是以同样的方式发生?

谢谢。

【问题讨论】:

    标签: python tensorflow keras conv-neural-network image-classification


    【解决方案1】:

    我不是tf图像处理方面的专家,但我尽量回答:

    1

    我不太明白这个问题,因为您使用的是image_dataset_from_directory,它应该为您处理文件加载过程。到目前为止,对我来说,你在那里做的事情看起来不错。

    2

    让我引用tf.keras.preprocessing.image_dataset_from_directory

    然后调用 image_dataset_from_directory(main_directory, labels='inferred') 将返回产生批次的 tf.data.Dataset 来自子目录 class_a 和 class_b 的图像,以及 标签 0 和 1(0 对应于 class_a,1 对应于 class_b)。

    还有ImageDataGenerator

    通过实时数据增强生成批量张量图像数据。 数据将被循环(分批)。

    由于您的数据是精心挑选的,因此不需要ImageDataGenerator,因为image_dataset_from_directory 会返回您想要的。如果您测试和验证数据(您应该拥有),您可以使用 tf.data.Dataset 函数在测试、训练和有效中拆分数据。这可能有点笨拙,但学习tf.data.dataset 的时间很值得。

    3

    混淆矩阵给出了 F1-Score、Precision 和 Recall 值。但是由于混淆矩阵通常用于二进制分类(这不是你的情况),它只返回一个类(而不是这个类)的那些值。更好地使用 metrics Tensorflow 所依赖的。 Tensorflow 可以为您计算召回率和准确率以及 F1 分数作为指标,所以如果您问我,请使用它们。

    4

    根据数据的混洗和结构化方式,这可能是正常的。当训练数据中有更多的特殊情况时,模型将更难预测它们是否正确。当测试标签中有更简单的预测时,那里的模型会更好,这会给你更高的准确度。这确实是一个指标,表明您的训练数据和测试数据中的类可能分布不均。

    5

    tf.data.Dataset 在需要时加载数据。这意味着,在训练过程开始之前文件不会加载到内存中,这会导致第一个时期很长(首先加载所有图像)和第二个很短的时期(哦,酷,所有图像都已经存在)。您可以通过检查您的机器的 gpu 使用情况来批准这一点,它通常应该什么都不做或非常低。

    要解决此问题,您可以在数据集变量上使用 .prefetch(z)。 'prefetch() '使数据集预取下一个 'z' 值,而 gpu 已经在进行一些计算。这可能会加快第一个 epoch。

    【讨论】:

    • 很高兴为您提供帮助。请点击分数下方的标记,将我的答案作为已接受的答案并考虑对其进行评分,以便其他人可以从中受益
    猜你喜欢
    • 2022-06-16
    • 2020-12-12
    • 2019-01-30
    • 2017-05-02
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多