實戰播:
怎么判定一個模型好不好,你設置的值對不對?? 需要再看幾個值:
例如:
model = Sequential()for units in model_structure:model.add(Dense(units, activation='relu'))model.add(Dropout(train_config.get('dropout_rate', 0.3)))model.add(Dense(1, activation='sigmoid'))
他的訓練集表現損失值不好! 一直維持在0.68+;這就需要不好了;
那么 模型的損失(loss)值表現不佳 怎么解決這個問題?
-
調整學習率:如果學習率過高,可能導致損失值波動,建議嘗試降低學習率,例如使用學習率衰減策略來動態調整學習率。(這個可以看我之前的:創作中心-CSDN)
-
數據增強:如果訓練數據集規模較小,可以使用數據增強技術,例如隨機旋轉、剪裁等,增強數據的多樣性和模型的泛化能力。(因為我現在是一個2分類問題,全部都是數據,所以就不考慮;唯一的方式就是增加數據量!)
-
模型正則化:增加Dropout層或使用L1/L2正則化,防止模型過擬合。例如,Dropout的概率可以調整為0.2到0.5之間。
-
調整網絡結構:嘗試不同的模型結構,比如增加或減少神經元的數量,或者導入復雜的層結構(例如,殘差連接)來改善模型性能。
-
批量大小(Batch Size)調整:確保Batch Size適中,過小可能導致不穩定,過大則可能導致計算不精確。可以嘗試調整Batch Size以優化訓練過程。
dense層和dropout層:
想象你正在訓練一只機器人助手,它需要學會識別不同的水果。這個機器人有很多“小助手”(神經元),它們一起合作來完成任務。
-
Dense層(全連接層)
- 小助手A:負責把水果的特征(顏色、形狀、大小)整理成一份報告。
- 小助手B:負責根據這份報告,判斷水果是蘋果、香蕉還是橘子。
- 小助手C:負責把判斷結果轉化為機器人能理解的指令,比如“抓取蘋果”。
- 每個小助手都和其他小助手緊密合作,確保信息傳遞準確無誤。
在代碼中,Dense(units, activation='relu') 就是添加一個全連接層,units 是小助手的數量,activation='relu' 是小助手們合作時使用的方式(ReLU激活函數)。
-
Dropout層
- 在訓練過程中,為了讓小助手們不要過于依賴某些特定的水果特征,機器人會隨機讓部分小助手“休息”。
- 比如,今天小助手A和B休息了,小助手C和D繼續工作。這樣,機器人學會了在不同的小助手組合下完成任務,變得更加靈活和穩定。
在代碼中,Dropout(train_config.get('dropout_rate', 0.3)) 就是設置讓30%的小助手隨機“休息”,以防止過擬合。
總結
- Dense層:像是一個團隊,每個成員都緊密合作,負責特定的任務。
- Dropout層:像是一個輪換機制,確保團隊成員不會過于依賴某些特定的成員,從而提升整體的適應能力。
案例表達: (模型正則化)
1.當我嘗試把dropout_rate從0.3調到0.5
... (原先是0.71-->0.68,同時準確率維持在0.55+)
model.add(Dropout(train_config.get('dropout_rate', 0.5)))
2.現在我把代碼改為正則化:
model = Sequential()
for units in model_structure:model.add(Dense(units, activation='relu', kernel_regularizer=regularizers.l2(0.01))) # 使用L2正則化# model.add(Dense(units, activation='relu', kernel_regularizer=regularizers.l1(0.01))) # 使用L1正則化
model.add(Dense(1, activation='sigmoid'))
在此代碼中,kernel_regularizer=regularizers.l2(0.01)添加了L2正則化,而kernel_regularizer=regularizers.l1(0.01)則為L1正則化。
因此,當我使用L1或者L2之后,還沒有之前的手動效果好! 因此,這個訓練集--->舍棄正則化!!!
L1與L2正則化的定義
- L1正則化(Lasso回歸):通過在損失函數中增加權重絕對值的和作為懲罰項,從而驅使某些權重減小到零,生成稀疏解,適合特征選擇.
- L2正則化(Ridge回歸):通過增加權重平方和作為懲罰項,促使所有權重趨向較小的均勻值,而不是完全為零。它通過減少權重避免過擬合,增強模型的穩定性.
這兩種正則化方法可以在模型中結合使用,以提高模型的泛化能力和抗干擾能力。
訓練集(loss)和驗證集(val_loss)
- 訓練集(loss):這就像是在練習題上不斷練習,模型在這些題目上越來越熟練,錯誤越來越少。loss值越小,說明模型在訓練數據上表現越好。
- 驗證集(val_loss):這就像是在考試題目上測試,loss值越小,說明模型在真實數據上的表現越好。
訓練集(accuracy)和驗證集(val_accuracy)
- 訓練集(accuracy):這就像是在練習題上答對的比例,accuracy越高,說明模型在訓練數據上越熟練。
- 驗證集(val_accuracy):這就像是在考試題上答對的比例,accuracy越高,說明模型在真實數據上的表現越好。
數據
- epoch 1:模型剛開始訓練,loss和val_loss都很高,accuracy和val_accuracy也很低。就像剛上學的孩子,剛開始學東西,什么都不會。
- epoch 5:loss和val_loss都在下降,accuracy和val_accuracy也在上升。就像孩子逐漸掌握知識,練習題和考試題都能答對更多。
- epoch 10:loss和val_loss繼續下降,accuracy和val_accuracy繼續上升。就像孩子越來越熟練,考試成績也越來越好。
- epoch 15:loss和val_loss下降變慢,accuracy和val_accuracy也趨于穩定。就像孩子已經掌握了大部分知識,進一步提高需要更多的努力。
總結
數據表示:
模型在訓練過程中的表現,
loss和val_loss越小,accuracy和val_accuracy越高,說明模型越來越好。
就像孩子從不會到會,從生疏到熟練,再到精通,這是一個不斷學習和進步的過程。