概念
Dropout 是一種常用的正則化技術,用于減少深度神經網絡中的過擬合問題。它在訓練過程中隨機地將一部分神經元的輸出置為零,從而強制模型在訓練過程中學習多個獨立的子模型,從而減少神經元之間的依賴關系,提高模型的泛化能力。
原理
隨機失活:在每個訓練批次中,Dropout 隨機地選擇一些神經元,并將其輸出設置為零。這意味著這些神經元在此次訓練中不會被激活,也不會參與前向傳播和反向傳播。
訓練階段和預測階段:在訓練階段,通過將部分神經元失活,Dropout 有助于防止神經元的過度依賴,從而減少過擬合。在預測階段,Dropout 通常會關閉,因為此時需要使用整個網絡來進行推理。
集成效應:由于 Dropout 訓練了多個子模型,可以將它們合并起來形成一個集成模型,從而提高模型的性能和穩定性。
代碼實現
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers# 加載數據
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(-1, 28 * 28).astype('float32') / 255.0
x_test = x_test.reshape(-1, 28 * 28).astype('float32') / 255.0
y_train = keras.utils.to_categorical(y_train, num_classes=10)
y_test = keras.utils.to_categorical(y_test, num_classes=10)# 構建帶 Dropout 正則化的神經網絡模型
model = keras.Sequential([layers.Input(shape=(784,)), # 輸入層layers.Dense(128, activation='relu'), # 隱藏層layers.Dropout(0.5), # Dropout 層,隨機失活率為 0.5layers.Dense(10, activation='softmax') # 輸出層
])# 編譯模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# 訓練模型
model.fit(x_train, y_train, batch_size=64, epochs=10, validation_split=0.1)# 評估模型
test_loss, test_accuracy = model.evaluate(x_test, y_test)
print("Test Loss:", test_loss)
print("Test Accuracy:", test_accuracy)