在训练过程中加入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)

猜你喜欢

转载自blog.csdn.net/sun___M/article/details/83749329