更新時間:2023-08-02 來源:黑馬程序員 瀏覽量:
在深度學習中,加入正則化是為了防止過擬合(overfitting)現(xiàn)象的發(fā)生。過擬合指的是模型在訓練數(shù)據(jù)上表現(xiàn)得很好,但在未見過的測試數(shù)據(jù)上表現(xiàn)不佳,因為模型在訓練過程中過度擬合了訓練數(shù)據(jù)的噪聲和細節(jié)。正則化的目的是限制模型的復雜性,以提高其在未知數(shù)據(jù)上的泛化能力。
常見的正則化技術(shù)有:
也稱為Lasso正則化,通過增加模型參數(shù)的絕對值之和作為懲罰項來限制模型復雜性。它可以促使模型產(chǎn)生稀疏權(quán)重,即許多參數(shù)變?yōu)榱?,從而實現(xiàn)特征選擇的效果。
也稱為Ridge正則化,通過增加模型參數(shù)的平方和作為懲罰項來限制模型復雜性。與L1正則化不同,L2正則化傾向于讓參數(shù)接近于零,但不嚴格等于零。
在訓練過程中,隨機將一部分神經(jīng)元的輸出置為零,以減少不同神經(jīng)元之間的依賴性。這樣做可以促使網(wǎng)絡(luò)學習更魯棒的特征,并減少過擬合。
現(xiàn)在讓我們通過Python代碼演示如何在神經(jīng)網(wǎng)絡(luò)中使用L2正則化。
首先,我們需要導入必要的庫和模塊:
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.regularizers import l2
然后,我們準備一些虛擬的訓練數(shù)據(jù):
# 生成虛擬的訓練數(shù)據(jù)
np.random.seed(42)
X_train = np.random.random((1000, 10))
y_train = np.random.randint(2, size=(1000, 1))
X_test = np.random.random((200, 10))
y_test = np.random.randint(2, size=(200, 1))
接下來,我們創(chuàng)建一個包含L2正則化的神經(jīng)網(wǎng)絡(luò)模型:
# 創(chuàng)建神經(jīng)網(wǎng)絡(luò)模型
model = Sequential()
model.add(Dense(16, activation='relu', input_shape=(10,), kernel_regularizer=l2(0.01)))
model.add(Dense(8, activation='relu', kernel_regularizer=l2(0.01)))
model.add(Dense(1, activation='sigmoid'))
# 編譯模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
在上面的代碼中,我們使用了kernel_regularizer=l2(0.01)來在每一層的權(quán)重上添加L2正則化,其中0.01是正則化的系數(shù),控制正則化的強度。較大的正則化系數(shù)會對權(quán)重施加更強的懲罰,使權(quán)重更加接近于零。
最后,我們進行模型的訓練并評估:
# 訓練模型
model.fit(X_train, y_train, batch_size=32, epochs=50, validation_data=(X_test, y_test))
# 評估模型在測試集上的性能
loss, accuracy = model.evaluate(X_test, y_test)
print(f'Test accuracy: {accuracy:.4f}')
通過這樣的操作,我們在神經(jīng)網(wǎng)絡(luò)中應(yīng)用了L2正則化,有助于防止過擬合,提高了模型在未知數(shù)據(jù)上的泛化能力。