使用张量流进行多类分类时遇到问题

Having problems while doing multiclass classification with tensorflow

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

你好,

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

1-我的数据在我的本地磁盘上。 link 上面的 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 to my code ? some others say, use scikit-learn's confusion matrix,但这次我必须定义 y-true,y_pred 值,我无法将其放入此代码中。我应该为 5 个不同的预测评估 5 个不同的混淆矩阵吗?

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

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

谢谢。

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

1

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

2

让我引用 tf.keras.preprocessing.image_dataset_from_directory:

Then calling image_dataset_from_directory(main_directory, labels='inferred') will return a tf.data.Dataset that yields batches of images from the subdirectories class_a and class_b, together with labels 0 and 1 (0 corresponding to class_a and 1 corresponding to class_b).

ImageDataGenerator

Generate batches of tensor image data with real-time data augmentation. The data will be looped over (in batches).

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

3

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

4

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

5

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

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