使用张量流进行多类分类时遇到问题
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).
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 已经在进行一些计算。这可能会加快第一个纪元。
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).
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 已经在进行一些计算。这可能会加快第一个纪元。