在訓練過程中加入Dropout
阿新 • • 發佈:2018-11-27
Dropout是在訓練過程中,隨機地忽略部分神經元——也就是說,在正向傳播的過程中,這些被忽略的神經元對下游神經元的貢獻效果暫時消失,在反向傳播中,這些神經元也不會有任何權值的更新。
Dropout的思想的出現,主要是為了解決過擬合的問題。雖然說採用組合方法,也就是訓練多個模型,能夠在一定程度上解決過擬合的問題,但是會帶來非常大的時間開銷,而Dropout可以很好的解決這個問題。
在Keras的每個權重更新週期中,按照給定概率(比如說20%),隨機選擇要丟棄的節點,以實現Dropout。Dropout只能在模型訓練過程中使用,在評估模型時不能使用。
Dropout的使用分為兩種:
(一)在輸入層使用Dropout:
這裡在輸入層之後新增一個新的Dropout層,Dropout率設為20%——即每個更新週期中20%的輸入將被隨機排除。
""" 為了提高泛化能力,解決過擬合問題,引入Dropout """ #這裡是在輸入層使用Dropout from sklearn import datasets import numpy as np from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout from keras.optimizers import SGD from keras.wrappers.scikit_learn import KerasClassifier from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold #匯入資料 dataset = datasets.load_iris() x=dataset.data Y=dataset.target #隨機種子 seed=7 np.random.seed(seed) #構建模型函式 def create_model(init='glorot_uniform'): #構建模型 model = Sequential() model.add(Dropout(rate=0.2, input_shape=(4,))) model.add(Dense(units=4, activation='relu', kernel_initializer=init)) model.add(Dense(units=6, activation='relu', kernel_initializer=init)) model.add(Dense(units=3, activation='softmax', kernel_initializer=init)) #定義Dropout sgd = SGD(lr=0.01, momentum=0.8, decay=0.0, nesterov=False) #編譯模型 model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) return model model = KerasClassifier(build_fn=create_model, epochs=200, batch_size=5, verbose=0) kfold = KFold(n_splits=10,shuffle=True, random_state=seed) results = cross_val_score(model, x, Y, cv=kfold) print('accuracy: %.2f%% (%.2f)' % (results.mean()*100, results.std()))
這裡結果顯示Accuracy為:
accuracy: 84.00% (0.11)
(二)在隱藏層使用Dropout:
Dropout同樣可以應用於神經網路模型中的隱藏層神經元。這裡將在兩個隱藏層之間,以及最後一個隱藏層和輸出層之間使用Dropout。這裡也將Dropout率設定為20%,並對權重進行約束,使其最大限度不超過3。
""" 為了提高泛化能力,解決過擬合問題,引入Dropout """ #這裡是在隱藏層之間層使用Dropout from sklearn import datasets import numpy as np from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout from keras.optimizers import SGD from keras.wrappers.scikit_learn import KerasClassifier from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold #新引入限制權值的引數 from keras.constraints import max_norm #匯入資料 dataset = datasets.load_iris() x=dataset.data Y=dataset.target #隨機種子 seed=7 np.random.seed(seed) #構建模型函式 def create_model(init='glorot_uniform'): #構建模型 model = Sequential() model.add(Dense(units=4, activation='relu', input_dim=4, kernel_initializer=init, kernel_constraint=max_norm(3))) model.add(Dropout(rate=0.2)) model.add(Dense(units=6, activation='relu', kernel_initializer=init, kernel_constraint=max_norm(3))) model.add(Dropout(rate=0.2)) model.add(Dense(units=3, activation='softmax', kernel_initializer=init)) #定義Dropout sgd = SGD(lr=0.01, momentum=0.8, decay=0.0, nesterov=False) #編譯模型 model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) return model model = KerasClassifier(build_fn=create_model, epochs=200, batch_size=5, verbose=0) kfold = KFold(n_splits=10,shuffle=True, random_state=seed) results = cross_val_score(model, x, Y, cv=kfold) print('accuracy: %.2f%% (%.2f)' % (results.mean()*100, results.std()))
這裡結果:
accuracy: 86.00% (0.14)