二进制输出的模型和分类报告之间的 Keras 准确性不同

约瑟夫·亚当

这是我如何加载包含图像数据的 2 个文件夹的数据:

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    main_folder,
    validation_split=0.1,
    subset="training",
    seed=123,
    image_size=(dim, dim))

val_ds = tf.keras.preprocessing.image_dataset_from_directory(
    main_folder,
    validation_split=0.1,
    subset="validation",
    seed=123,
    image_size=(dim, dim))

从文件夹加载训练数据给出

Found 6457 files belonging to 2 classes.
Using 5812 files for training.
Found 6457 files belonging to 2 classes.
Using 645 files for validation.

这是我训练模型的方法:

model = tf.keras.models.Sequential([
    tf.keras.layers.experimental.preprocessing.Rescaling(1. / 255),
    tf.keras.layers.Conv2D(16, (3, 3), activation='relu', padding='same'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', padding='same'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', padding='same'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss=tf.losses.BinaryCrossentropy(from_logits=True), optimizer="adam", metrics=["accuracy"])

es = EarlyStopping(monitor='val_accuracy', min_delta=0.1, patience=5)

model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=epc,
    callbacks=[es])

这是我得到结果的方式:

y_pred = model.predict(val_ds)
predicted_categories = tf.argmax(y_pred, axis=1)
true_categories = tf.concat([y for x, y in val_ds], axis=0)
    
print(classification_report(true_categories, predicted_categories ))

矛盾的输出是:

Epoch 1/100
182/182 [==============================] - 8s 44ms/step - loss: 0.6617 - accuracy: 0.5139 - val_loss: 0.6466 - val_accuracy: 0.3442
Epoch 2/100
182/182 [==============================] - 8s 46ms/step - loss: 0.6613 - accuracy: 0.5712 - val_loss: 0.6460 - val_accuracy: 0.6558
Epoch 3/100
182/182 [==============================] - 8s 44ms/step - loss: 0.6611 - accuracy: 0.5594 - val_loss: 0.6474 - val_accuracy: 0.3442
Epoch 4/100
182/182 [==============================] - 8s 46ms/step - loss: 0.6315 - accuracy: 0.6504 - val_loss: 0.4623 - val_accuracy: 0.9690
Epoch 5/100
182/182 [==============================] - 8s 46ms/step - loss: 0.4780 - accuracy: 0.9554 - val_loss: 0.4597 - val_accuracy: 0.9690
Epoch 6/100
182/182 [==============================] - 8s 45ms/step - loss: 0.4831 - accuracy: 0.9434 - val_loss: 0.4517 - val_accuracy: 0.9845
Epoch 7/100
182/182 [==============================] - 8s 45ms/step - loss: 0.4720 - accuracy: 0.9658 - val_loss: 0.4546 - val_accuracy: 0.9736
Epoch 8/100
182/182 [==============================] - 8s 44ms/step - loss: 0.4719 - accuracy: 0.9652 - val_loss: 0.4507 - val_accuracy: 0.9860
Epoch 9/100
182/182 [==============================] - 8s 44ms/step - loss: 0.4747 - accuracy: 0.9597 - val_loss: 0.4528 - val_accuracy: 0.9814

              precision    recall  f1-score   support
           0       0.34      1.00      0.51       222
           1       0.00      0.00      0.00       423
    accuracy                           0.34       645
   macro avg       0.17      0.50      0.26       645
weighted avg       0.12      0.34      0.18       645

否则,每次执行时我都会得到不同的答案

在此处输入图片说明

有人可以请教为什么分类报告的准确率为 34% 而模型 val_accuracy 为 0.94%?

弗雷特拉
tf.keras.preprocessing.image_dataset_from_directory

方法有一个参数被调用label_mode,它的默认值是int适合于sparse_categoricalcrossentropy等。label_model = binary如果分类是二分类,应该改成

矛盾在这里:

tf.keras.layers.Dense(1, activation='sigmoid')

predicted_categories = tf.argmax(y_pred, axis=1)

随着sigmoid你的输出由具有形状的列表(1,)当您获取argmax该列表时,它总是返回零作为索引,因为该列表只有一个索引。所以你需要在使用时应用一些阈值方法sigmoidSigmoid 将输出压缩到 [0,1] 的范围内。所以你可以这样做:

predicted_categories = [1 * (x[0]>=0.5) for x in y_pred]

这意味着如果预测值大于0.5那么它将属于第二类。您可以根据需要调整阈值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Keras:模型之间的分类报告准确性不同。多类的预测准确性

Keras二进制分类器教程示例仅提供50%的验证准确性

R中的python keras和keras之间的准确性不同

Keras的CNN模型的准确性差

为什么Keras model.fit和model.evaluate之间的准确性不同?

Keras如何计算多类别分类问题的验证准确性和训练准确性?

Keras:模型的准确性在达到99%的准确性和损失0.01后下降

R的Keras与Python的Keras之间的差异-准确性错误?

Keras图像分类:显示的准确性较高,但测试图像的准确性较低

Keras:检索每个模型输出的准确性

多标签分类keras的怪异准确性

如何在Keras中输出每班的准确性?

Tensorflow和Keras中的相同(?)神经网络架构在相同数据上产生不同的准确性

keras如何定义“准确性”和“损失”?

MNIST的Keras VGG模型:训练和验证准确性之间的差异

R中二进制分类的随机森林截断和准确性度量

为什么fit_generator的准确性与Keras中的valuate_generator的准确性不同?

使用 keras/python 和 CSV 文件创建顺序模型但准确性不佳

我的keras神经网络模型的准确性和损失不稳定

Tensorflow 和 Keras 如何从单热编码输出到用于计算准确性的类预测?

如何在Keras中提高CNN分类器的准确性?

Keras文本分类:验证准确性不会改变

Keras图像分类网络始终预测一个类别,并保持50%的准确性

Keras / Tensoflow训练期间报告的“准确性”是什么意思?

Keras:模型。评估与模型。预测多类NLP任务中的准确性差异

Keras顺序模型的准确性很差。模型正在忽略/忽略一个类

Keras Sequential 模型虽然相同,但准确性低于功能模型

仅当验证准确性提高时,如何才能保存/覆盖我的TensorFlow / Keras模型?

Keras:如何评估模型的准确性(evaluate_generator与predict_generator)?