神经网络的正则化

另一种避免过拟合的方法是正则化。通过正则化,神经网络中数值大的权重在计算损失 (函数)时会受到惩罚,这避免了 DNN 中某些连接变得过于强大和占主导地位的情况。可 以通过 Dense 层中的参数在 Keras 的 DNN 中引入正则化。根据选择的正则化参数,训练集 准确率和测试集准确率可以非常接近。一般使用两种正则化器,一种基于线性范数 l1,一 种基于欧几里得范数 l2。以下 Python 代码为模型创建函数添加了正则化。 In [60]: from keras.regularizers import l1, l2 In [61]: def create_model(hl=1, hu=128, dropout=False, rate=0.3, regularize=False, reg=l1(0.0005), optimizer=optimizer, input_dim=len(cols)): if not regularize: reg = None model = Sequential() model.add(Dense(hu, input_dim=input_dim, activity_regularizer=reg, ➊ activation='relu')) if dropout: model.add(Dropout(rate, seed=100)) for _ in range(hl): model.add(Dense(hu, activation='relu', activity_regularizer=reg)) ➊ if dropout: model.add(Dropout(rate, seed=100)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy']) return model In [62]: set_seeds() model = create_model(hl=1, hu=128, regularize=True) In [63]: %%time model.fit(train_[cols], train['d'], epochs=50, verbose=False, validation_split=0.2, shuffle=False, class_weight=cw(train)) CPU times: user 5.49 s, sys: 1.05 s, total: 6.54 s Wall time: 3.15 s Out[63]: In [64]: model.evaluate(train_[cols], train['d'])182 | 第 7 章 1746/1746 [==============================] - 0s 15us/step Out[64]: [0.5307255412568205, 0.7691867351531982] In [65]: model.evaluate(test_[cols], test['d']) 437/437 [==============================] - 0s 22us/step Out[65]: [0.8428352184644826, 0.6590389013290405] ➊ 正则化被添加到每一层。 图 7-5 显示了正则化下的训练集准确率和验证集准确率,这两个性能指标比以前看到的要 紧密得多。 In [66]: res = pd.DataFrame(model.history.history) In [67]: res[['accuracy', 'val_accuracy']].plot(figsize=(10, 6), style='--'); 训练集准确率 验证集准确率 图 7-5:训练集准确率值和验证集准确率值(使用正则化) 当然,暂退和正则化可以一起使用。将两个度量结合起来甚至可以更好地避免过拟合,并 使样本内和样本外的准确率值更接近。在这种情况下,训练集准确率和验证集准确率之间 的差异确实是最小的。 In [68]: set_seeds() model = create_model(hl=2, hu=128, dropout=True, rate=0.3, ➊ regularize=True, reg=l2(0.001), ➋ ) In [69]: %%time model.fit(train_[cols], train['d'], epochs=50, verbose=False, validation_split=0.2, shuffle=False,密集神经网络 | 183 class_weight=cw(train)) CPU times: user 7.06 s, sys: 958 ms, total: 8.01 s Wall time: 4.28 s Out[69]: In [70]: model.evaluate(train_[cols], train['d']) 1746/1746 [==============================] - 0s 18us/step Out[70]: [0.5007762827004764, 0.7691867351531982] In [71]: model.evaluate(test_[cols], test['d']) 437/437 [==============================] - 0s 23us/step Out[71]: [0.6191965124699835, 0.6864988803863525] ➊ 在模型创建中加入暂退。 ➋ 在模型创建中加入正则化。 图 7-6 显示了结合暂退和正则化时的训练集准确率和验证集准确率。在整个训练期间,训 练集准确率和验证集准确率之间的差异平均仅为大约 4 个百分点。 In [72]: res = pd.DataFrame(model.history.history) In [73]: res[['accuracy', 'val_accuracy']].plot(figsize=(10, 6), style='--'); 训练集准确率 验证集准确率 图 7-6:训练集准确率值和验证集准确率值(同时使用暂退和正则化) 惩罚大权重 正则化通过惩罚神经网络中的大权重来避免过拟合。单个权重不能大到足以 支配神经网络,从而使权重整体保持在可比水平。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值