1. 程式人生 > >在訓練過程中加入Dropout

在訓練過程中加入Dropout

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)