Colab链接为here:
导入数据的方式如下
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
main_folder,
validation_split=0.1,
subset="training",
label_mode='categorical',
seed=123,
image_size=(dim, dim))
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
main_folder,
validation_split=0.1,
subset="validation",
label_mode='categorical',
seed=123,
image_size=(dim, dim))
该模型通过以下方式训练
model = tf.keras.models.Sequential([
tf.keras.layers.experimental.preprocessing.Rescaling(1. / 255),
...
tf.keras.layers.Dense(2, activation='softmax')
])
model.compile(optimizer="adam", loss=tf.keras.losses.CategoricalCrossentropy(), metrics=['accuracy'])
我正在努力获得正确的predicted categories
和正确的true_categories
来使分类报告工作:
y_pred = model.predict(val_ds, batch_size=1)
predicted_categories = np.argmax(y_pred, axis=1)
true_categories = tf.concat([y for x, y in val_ds], axis=0).numpy()
true_categories_argmax = np.argmax(true_categories, axis=1)
print(classification_report(true_categories_argmax, predicted_categories))
此时,epoch的输出与分类报告相矛盾
Epoch 22/75
144/144 [==============================] - 7s 48ms/step - loss: 0.0611 - accuracy: 0.9776 - val_loss: 0.0768 - val_accuracy: 0.9765
模型的验证集返回
model.evaluate(val_ds)
[==============================] - 0s 16ms/step - loss: 0.0696 - accuracy: 0.9784
[0.06963862478733063, 0.9784313440322876]
而分类报告则大不相同:
precision recall f1-score support
0.0 0.42 0.44 0.43 221
1.0 0.56 0.54 0.55 289
accuracy 0.49 510
macro avg 0.49 0.49 0.49 510
weighted avg 0.50 0.49 0.50 510
3条答案
按热度按时间ecfdbz9o1#
你设置
label_mode='categorical'
,那么这是一个多类分类,你需要在最后一个密集层使用softmax
激活。因为softmax强制输出总和等于1。你可以把它们解释为概率。使用sigmoid
,不可能找到主要类。它可以无限制地分配任何值。我的模型最后一层:
Dense(5, activation = 'softmax')
我的模特损失:
loss=tf.keras.losses.CategoricalCrossentropy()
,和你的一样。在这种情况下,标签是独热编码的。**说明:**我使用了5类分类用于演示目的,但它遵循相同的逻辑。
这包含了每个类的概率,例如第一个例子有43%的概率属于类2。您需要使用
argmax
来查找类索引。我们现在有了预测的类。现在需要获得真正的类。
如果您将此输入分类报告,您将获得以下信息:
我们还需要:
现在可以进行比较了。
这应该会产生预期的结果:
编辑:
tf.keras.preprocessing.image_dataset_from_directory
设置shuffle = True
可能会打乱类。对于val_ds
,请尝试设置shuffle = False
。如下所示:**编辑2:**以下是我提出的:
分类报告:
bq8i3lrv2#
我在那里,我有同样的问题,对我来说,这是不够的,有一个softmax层和shuffle = False.事实上,设置shuffle = False在image_dataset_from_directory我有以下问题:train_ds仅包含5个类中的3个,瓦尔_ds包含5个类中的2个(在不创建异质样本的情况下进行拆分)
如果有帮助的话,我被建议做以下事情:
ee7vknir3#
我在这里遇到的一个问题是我的数据集是批处理的。一种方法是将batch_size设置为1:
然后照常拟合模型得到分类报告如下:
希望这个有用。