gpt4 book ai didi

python - 不同模型的训练精度不同,但测试精度相同

转载 作者:行者123 更新时间:2023-11-30 09:58:20 25 4
gpt4 key购买 nike

我正在努力开发一个深度学习分类器 - 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]]

最佳答案

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

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

可以从您在那里显示的混淆矩阵轻松推断出这一观察结果。

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

  • 143369 + 2958 = 146327。
  • (143369/146327) * 100 = 97.97%(这比您报告的准确度稍大一些,但在相同的范围内 - 微小的差异源于 keras< 中的 evaluate_score/)

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

现在让我们继续解决这个问题!

既然我们已经提到了这一观察结果,您必须执行以下操作来解决此问题(或结合其中一些问题):

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

其次,请引用以下过程以获得良好的模型:

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

关于python - 不同模型的训练精度不同,但测试精度相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60107950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com