簡體   English   中英

不同模型的訓練精度不同但測試精度相同

[英]Different training accuracy for different models but same testing accuracy

我正在努力開發一個深度學習分類器 - 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 類,但無法識別第 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. 使用數據集擴充。 解決不平衡數據集的最佳方法是使用過采樣。 您可以通過在少數類中添加更多示例來平衡類的支持,而不是對代表性良好的類進行欠采樣從而減少數據集的方差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM