【问题标题】:Different training accuracy for different models but same testing accuracy不同模型的训练精度不同,但测试精度相同
【发布时间】:2020-05-23 06:22:33
【问题描述】:

我正在开发一个深度学习分类器 - 2 类。我正在使用的数据集不平衡。我做了下采样来解决同样的问题。然后,我创建了两个类的小数据样本,并创建了一个深度学习模型,如下所示:

dl_model = Sequential()

n_cols = X_train.shape[1]

dl_model.add(Dense(1024, activation='relu', input_shape=(n_cols,)))
dl_model.add(Dense(512, activation='relu'))
dl_model.add(Dense(256, activation='relu'))
dl_model.add(Dense(256, activation='relu'))
dl_model.add(Dense(128, activation='relu'))
dl_model.add(Dense(64, activation='relu'))
dl_model.add(Dense(2, activation='softmax'))

adam= optimizers.Adam(lr=0.001)

dl_model.compile(optimizer=adam, loss='sparse_categorical_crossentropy', metrics=['accuracy'])

early_stopping_monitor = EarlyStopping(patience=3)

dl_model.fit(X_train, y_train, epochs=10, validation_split=0.2, batch_size=1000,callbacks=[early_stopping_monitor], shuffle=True)

model_json = dl_model.to_json()
with open("model.json", "w") as json_file:
    json_file.write(model_json)

dl_model.save_weights("model.h5")

对于不同的超参数调整,我得到如下结果:

型号 1 - train_loss: 7.7971 - train_acc: 0.5160 - val_loss: 9.6992 - val_acc: 0.3982

模型 2 - train_loss: 2.8257 - train_acc: 0.8201 - val_loss: 2.9312 - val_acc: 0.8160

模型 3 - train_loss: 3.1887 - train_acc: 0.8002 - val_loss: 3.5195 - val_acc: 0.7808

我保存每个模型,然后将其加载到不同的文件中,在其中我将模型应用于整个数据集并计算如下指标:

sc = MinMaxScaler()
X = sc.fit_transform(X)

json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("model.h5")

loaded_model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
score = loaded_model.evaluate(X, y, verbose=0)
print("Deep learning accuracy %s: %.2f%%" % (loaded_model.metrics_names[1], score[1]*100))

以上 3 个模型都给出了相同的准确度。即使是相同的混淆矩阵。可能是什么原因?这 3 个模型不应该给出不同的结果,因为它们具有不同的训练准确度/指标吗?

更新:

加载任何模型时,我得到的准确度与97.82% 和混淆矩阵相同:

[[143369      0]

 [  2958      0]]

【问题讨论】:

  • 介意分享加载后的结果吗?会使用不同的文件来加载每个模型吗?只是为了确定?
  • @Eliethesaiyan,当然。更新了帖子。
  • 嗯,看起来很笨拙,你会尝试model.save("model.h5"),因为它既保存了权重又保存了架构,并使用load_model 加载它,看看结果是否相同?

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

您在这里遇到的问题是,您训练的所有神经网络都无法正确学习第二类,即代表性较差的一类。

您在测试集上的准确率是相同的,因为 model_1 或 model_2 或 model_3 都无法区分类 1 和类 2,因此它们三个都知道识别类 1,但未能识别类 2。换句话说,当您在测试集上进行测试时,无论您在训练期间看到的差异如何,结果都是相同的。

这个观察可以很容易地从您在那里显示的混淆矩阵中推断出来。

假设您不知道上述观察结果。让我们做一些简单的数学运算:

  • 143369 + 2958 = 146327。
  • (143369/146327) * 100 = 97.97%(这比您报告的准确率略高,但在同一个范围内 - 细微差别源于 evaluate_score 中的 keras

您还可以由此推断(不仅在视觉上看到您没有第 2 类的 TP(真阳性))您有问题。

让我们现在着手解决这个问题!

由于我们已经提到了这个观察,你必须执行以下操作来解决这个问题(或其中一些结合起来):

首先,从较低的学习率开始(0.0001 是更好的开始选择)。

其次,请参考以下程序以获得好的模型:

  1. 删除EarlyStopping(patience=3)
  2. 根据与准确性不同的指标(例如 F1 分数)保存您的最佳模型
  3. 在训练时降低 learning_rate (ReduceLROnPlateau)。您可以使用以下回调,它比 EarlyStopping 更适合您的情况:https://keras.io/callbacks/#reducelronplateau
  4. 使用数据集扩充。处理不平衡数据集的最佳方法是使用过采样。您可以通过在少数类中添加更多示例来平衡类的支持,而不是对表现良好的类进行欠采样从而减少数据集的方差。

【讨论】:

  • 我已经提供给我的数据,所以我无法获得更多的少数类数据。但我会尝试其他选项。
  • 很好,没问题。我相信应用 1+2+3 会带来更好的结果。祝你好运
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2020-09-11
  • 2021-09-14
相关资源
最近更新 更多