如何處理 TensorFlow 模型中的過擬合?
瀏覽:2413
如何處理 TensorFlow 模型中的過擬合?
最后更新日期 : 2024 年 5 月 7 日
當機器學習模型學會在訓練數據上表現良好,但無法推廣到新的、看不見的數據時,就會發生過擬合。在 TensorFlow 模型中,過擬合通常表現為訓練數據集的準確率較高,但驗證或測試數據集的準確率較低。當模型在訓練數據中捕獲噪聲或隨機波動時,就會發生這種現象,就好像它們是真實的模式一樣,從而導致看不見的數據性能不佳。
為什么 TensorFlow 模型會出現過擬合?
過度擬合可能由多種因素引起,包括:
- 復雜模型架構:如果模型相對于可用的訓練數據量來說過于復雜,它可以記住訓練數據,而不是學習可泛化的模式。
- 訓練數據不足:如果訓練數據集較小,則模型可能無法在數據中捕獲足夠的可變性,從而導致過度擬合。
- 缺乏正則化:如果沒有 dropout、L1/L2 正則化或提前停止等正則化技術,模型可能會因為不懲罰過于復雜的權重而過擬合。
- 數據不匹配:如果訓練數據集和測試數據集之間存在顯著差異(例如,不同的分布、噪聲水平),則模型可能難以泛化。
如何緩解 Tensorflow 模型中的過擬合?
使用以下檢查,可以在 TensorFlow 模型中顯著減少過擬合:
- 降低模型復雜性:過于復雜的模型更容易出現過擬合,因為它們有更多的參數來記住訓練數據。考慮減少神經網絡架構中的層數或神經元數。
- 正則化:L1 和 L2 正則化等正則化技術向損失函數添加了一個懲罰項,從而阻止了模型中的大權重。TensorFlow 通過層構造函數中的 kernel_regularizer 參數提供對正則化的內置支持。
- Dropout:Dropout 是一種正則化技術,其中隨機選擇的神經元在訓練過程中被忽略。這有助于防止神經元的共適應并減少過度擬合。您可以使用 Dropout 層將 dropout 應用于 TensorFlow 中的層。
- 提前停止:在訓練期間監控模型在驗證數據集上的性能,并在性能開始下降時停止訓練。為此,TensorFlow 提供了 Early Stopping 回調。
- 數據增強:通過對輸入數據應用隨機轉換(例如旋轉、平移或翻轉)來增加訓練數據集的大小和多樣性。TensorFlow 提供了 ImageDataGenerator 等工具,用于圖像數據增強。
- 交叉驗證:使用 k 折疊交叉驗證等技術來評估模型在訓練數據的多個子集上的性能。這有助于確保您的模型能夠很好地泛化到看不見的數據。
- 批量歸一化:批量歸一化對網絡中每一層的激活進行歸一化,使訓練更加穩定,并降低過擬合的可能性。TensorFlow 為此提供了 BatchNormalization 層。
- 集成學習:訓練具有不同初始化或架構的多個模型,并結合它們的預測來做出最終預測。集成方法可以通過利用單個模型的多樣性來幫助減少過擬合。
在 TensorFlow 模型中處理過擬合
在本節中,我們將通過合并正則化、在密集層之間添加 dropout 并在每個 dropout 層之后應用批量歸一化來緩解過擬合。讓我們使用以下步驟在 TensorFlow 模型中處理過擬合:
第 1 步:導入庫
import tensorflow as tf
from tensorflow.keras.models
import Sequentialfrom tensorflow.keras.layers
import Dense, Dropout, BatchNormalization
from tensorflow.keras.callbacks
import EarlyStoppingfrom sklearn.model_selection
import train_test_split
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
步驟 2:生成示例數據
此模塊生成隨機樣本數據以進行演示。X 是一個 2D 數組,有 1000 行和 10 列介于 0 和 1 之間的隨機值,而 y 是一個有 1000 個隨機整數(0 或 1)的 1D 數組。
# Generate sample data
X = np.random.rand(1000, 10)
y = np.random.randint(2, size=(1000,))
第 3 步:將數據拆分為訓練集和驗證集
該代碼使用 sklearn.model_selection 中的 train_test_split 函數將數據集拆分為訓練集、驗證集和測試集。80% 的數據分配給訓練/驗證組合集,進一步分為 75% 用于訓練,25% 用于驗證,而 20% 分配給測試集以評估訓練模型的性能。
# Split data into training, validation, and testing sets
X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.25, random_state=42)
第 4 步:應用 PCA 進行降維
- PCA:主成分分析用于降低特征空間的維數。
- n_components=8:我們指定要將維數減少到 8 個主成分。
- fit_transform:使 PCA 適合訓練數據,并將訓練和驗證數據轉換為減少的空間。
# Apply PCA for dimensionality reduction
pca = PCA(n_components=8)
X_train_pca = pca.fit_transform(X_train)
X_val_pca = pca.transform(X_val)
X_test_pca = pca.transform(X_test)
第 5 步:在沒有正則化技術的情況下構建和評估模型
- 模型結構:神經網絡使用 由三層組成的模型 :第一層有 64 個神經元,第二層有 32 個神經元,均使用 ReLU 激活,最后一層有 1 個神經元,使用 sigmoid 激活進行二元分類。
SequentialDense - 編譯設置:它是使用 Adam 優化器編譯的,用作 損失函數,并在訓練和評估期間作為性能指標進行測量。
binary_crossentropyaccuracy - Early Stopping Callback: 如果連續 10 個 epoch 驗證損失沒有改善,則回調用于停止訓練,并恢復驗證損失最好的 epoch 的權重。
EarlyStopping - 訓練過程:使用該方法對模型進行訓練 ,其中特征由 PCA 縮減,批次大小為 32,并提供用于監控的驗證數據。如果驗證損失沒有改善,訓練可以提前停止,這要歸功于提前停止回調。
fit - 評估:使用該方法在單獨的測試數據集上評估模型的最終性能 ,返回最終損失和準確率,這有助于評估模型在訓練數據之外的泛化程度。
evaluate
model_overfit = Sequential([
Dense(64, activation='relu', input_shape=(8,)),
Dense(32, activation='relu'),
Dense(1, activation='sigmoid')
])
# Compile the model
model_overfit.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
# Define early stopping callback
early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)
# Train the model with early stopping
history_overfit = model_overfit.fit(X_train_pca, y_train, epochs=100, batch_size=32,
validation_data=(X_val_pca, y_val), callbacks=[early_stopping], verbose=0)
# Evaluate the model on testing data
loss_overfit, test_accuracy_overfit = model_overfit.evaluate(X_test_pca, y_test)
第 6 步:使用正則化構建和評估模型
- 增強的模型結構:該模型采用 三層設置 ,集成 L2 正則化以懲罰大權重并減少過度擬合。第一層和第二層密集層使用因子 0.01 進行正則化。
SequentialDense - 包含 Dropout 和 Batch Normalization:在密集層之間, 以 0.5 的速率應用,以在訓練期間將神經元輸出的一半隨機設置為零,從而進一步防止過擬合。 在 dropout 后使用,通過規范化激活來穩定和加速訓練過程。
DropoutBatchNormalization - 模型編譯:該模型使用 Adam 優化器進行編譯,并 作為損失函數,適用于二元分類任務。它還作為 性能指標進行跟蹤。
binary_crossentropyaccuracy - 使用提前停止進行訓練:使用 PCA 縮減的數據對模型進行訓練,如果驗證損失在 10 個周期內沒有改善,則結合提前停止以停止訓練,同時恢復訓練期間觀察到的最佳模型權重。
- 測試數據評估:最后,使用單獨的測試數據集對模型進行評估,提供損失和準確性指標,以評估模型對新數據的泛化程度。
# Build TensorFlow model with regularization, dropout, and batch normalization
model_regularized = Sequential([
Dense(64, activation='relu', input_shape=(8,), kernel_regularizer=tf.keras.regularizers.l2(0.01)),
Dropout(0.5),
BatchNormalization(),
Dense(32, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.01)),
Dropout(0.5),
BatchNormalization(),
Dense(1, activation='sigmoid')
])
# Compile the model
model_regularized.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
# Train the model with early stopping
history_regularized = model_regularized.fit(X_train_pca, y_train, epochs=100, batch_size=32,
validation_data=(X_val_pca, y_val), callbacks=[early_stopping], verbose=0)
# Evaluate the model on testing data
loss_regularized, test_accuracy_regularized = model_regularized.evaluate(X_test_pca, y_test)
步驟 7:打印結果
該代碼打印了兩個模型的測試損失和準確性,從而可以直接比較每個模型在處理看不見的數據時的表現。第一個模型缺乏正則化技術,可能導致過擬合,而第二個模型包括通過減少過擬合來增強其泛化能力的機制。
# Print results
print("Model without regularization, dropout, and batch normalization:")
print("Test Loss:", loss_overfit)
print("Test Accuracy:", test_accuracy_overfit)
print("\nModel with regularization, dropout, and batch normalization:")
print("Test Loss:", loss_regularized)
print("Test Accuracy:", test_accuracy_regularized)
在 TensorFlow 中處理過擬合的完整代碼
以下內容為付費內容,請購買后觀看
技術鄰APP
工程師必備
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP
1




















