我如何为我的图像分类器解释这个 - 低准确率但高精度和召回率?

问题描述

我正在使用迁移学习方法构建图像分类器。目前,我只是冻结 MobileNet 系列的所有层并替换输出层以适合我的数据集。我的设置如下:

  1. 使用 MobileNetV1 或 V2 为 4800 张图像(训练)和 2353 张图像(测试)提取特征和标签
  2. Epochs = 10,batch_size = 32,kfold = 10,优化器 = Adam (lr = 0.001)

当我运行这个没有数据增强时,我得到了一致的训练和验证准确度和损失,测试准确度也很好(> 85 %),即使学习曲线不稳定(图 1) .

当我运行这个数据增强时,我的训练和验证准确度和损失变得不稳定,高标准开发跨越 10 倍。但最终在测试数据集上的测试准确率很高,类似于没有数据增强的情况(图 2)。经过检查,我发现 train 和 val_accuracy 较低(~ 40 %),但 train 和 val_precision 以及 val_recall 高得多(~ 85 %)。我做了很多阅读,但都解释了如何解释高准确率/低准确率和召回率,而不是相反。

问题:

  1. 谁能帮我解释一下我的模型发生了什么?是我设置了代码还是我需要处理我的数据?
  2. 如何解释我的测试数据结果(看起来不错)与 10 倍的学习曲线之间的差异(参考屏幕截图 - 有和没有增强的曲线都有问题)?

Picture 1 - No Data Augmentation

Picture 2 - With Data Augmentation

fold_no = 1

for train,test in kfold.split(train_features,train_labels):
    mobile = models.Sequential()
    mobile.add(layers.Flatten(input_shape = (7,7,1024)))
    mobile.add(Dropout(0.4))
    mobile.add(layers.Dense(8,activation = 'softmax'))
    mobile.summary()
    
    # compile model
    mobile.compile(optimizer = optimizers.Adam(lr = 0.001),loss = 'categorical_crossentropy',metrics = ['accuracy',tf.keras.metrics.Precision(),tf.keras.metrics.Recall()])

    print('------------------------------------------------------------------------')
    print(f'Training for fold {fold_no} ...')
    # run model training
    history = mobile.fit(train_features[train],train_labels[train],epochs = epochs,batch_size = batch_size,validation_data = (train_features[test],train_labels[test]))
    # print scores for each fold
    scores = mobile.evaluate(train_features[test],train_labels[test],verbose = 0)
    print(f'score for fold {fold_no}: {mobile.metrics_names[0]} of {scores[0]}; {mobile.metrics_names[1]} of {scores[1]*100}%')
    acc_per_fold.append(scores[1] * 100)
    loss_per_fold.append(scores[0])
    precision_per_fold.append(scores[2])
    recall_per_fold.append(scores[3])

    plot_result(history)

    fold_no = fold_no + 1

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...