1

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

你好,

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

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

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

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

谢谢。

4

1 回答 1

0

我不是 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, asimage_dataset_from_directory返回您想要的。如果您测试和验证数据(您应该拥有),您可以使用tf.data.Dataset在测试、训练和验证中拆分数据的功能。这可能有点笨拙,但学习的时间tf.data.dataset花得很好。

3

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

4

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

5

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

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

于 2020-10-03T08:14:38.423 回答