深度学习Trick——用权重约束减轻深层网络过拟合|附(Keras)实现代码 (3)

       运行该示例,给出模型在训练数据集和测试数据集上的性能。
       可以看到模型在训练数据集上的性能优于测试数据集,这是发生过拟合的标志。鉴于神经网络和训练算法的随机性,每次仿真的具体结果可能会有所不同。因为模型是过拟合的,所以通常不会期望在相同数据集上能够重复运行得到相同的精度。

Train: 1.000, Test: 0.914

       创建一个图,显示训练和测试集上模型精度的线图。从图中可以看到模型过拟合时的预期形状,其中测试精度达到一个临界点后再次开始减小。

3

具有权重约束的多层感知器过拟合

       为了和上面做对比,现在对MLP使用权重约束。目前,有一些不同的权重约束方法可供选择。本文选用一个简单且好用的约束——简单地标准化权重,使得其范数等于1.0,此约束具有强制所有传入权重变小的效果。
       在Keras中可以通过使用unit_norm来实现,并且将此约束添加到第一个隐藏层,如下所示:

model.add(Dense(500, input_dim=2, activation='relu', kernel_constraint=unit_norm()))

       此外,也可以通过使用min_max_norm并将min和maximum设置为1.0 来实现相同的结果,例如:

model.add(Dense(500, input_dim=2, activation='relu', kernel_constraint=min_max_norm(min_value=1.0, max_value=1.0)))

       但是无法通过最大范数约束获得相同的结果,因为它允许规范等于或低于指定的限制; 例如:

model.add(Dense(500, input_dim=2, activation='relu', kernel_constraint=max_norm(1.0)))

       下面列出具有单位规范约束的完整代码:

# mlp overfit on the moons dataset with a unit norm constraint from sklearn.datasets import make_moons from keras.layers import Dense from keras.models import Sequential from keras.constraints import unit_norm from matplotlib import pyplot # generate 2d classification dataset X, y = make_moons(n_samples=100, noise=0.2, random_state=1) # split into train and test n_train = 30 trainX, testX = X[:n_train, :], X[n_train:, :] trainy, testy = y[:n_train], y[n_train:] # define model model = Sequential() model.add(Dense(500, input_dim=2, activation='relu', kernel_constraint=unit_norm())) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # fit model history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0) # evaluate the model _, train_acc = model.evaluate(trainX, trainy, verbose=0) _, test_acc = model.evaluate(testX, testy, verbose=0) print('Train: %.3f, Test: %.3f' % (train_acc, test_acc)) # plot history pyplot.plot(history.history['acc'], label='train') pyplot.plot(history.history['val_acc'], label='test') pyplot.legend() pyplot.show()

       运行该示例,给出模型在训练数据集和测试数据集上的性能。
       从下图可以看到,对权重进行严格约束确实提高了模型在验证集上的性能,并且不会影响训练集的性能。

Train: 1.000, Test: 0.943

       从训练和测试精度曲线图来看,模型已经在训练数据集上不再过拟合了,且模型在训练和测试数据集的精度保持在一个稳定的水平。

4

扩展

本节列出了一些读者可能希望探索扩展的教程:

报告权重标准:更新示例以计算网络权重的大小,并证明使用约束后,确实使得幅度更小;

约束输出层:更新示例以将约束添加到模型的输出层并比较结果;

约束偏置:更新示例以向偏差权重添加约束并比较结果;

反复评估:更新示例以多次拟合和评估模型,并报告模型性能的均值和标准差;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzyxd.html