在训练过程中加入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)
上一篇: POI2014 Bricks
下一篇: 如何重启windows的网卡