欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在训练过程中加入Dropout

程序员文章站 2022-03-06 22:19:54
...

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)