【深度学习】实验13 使用Dropout抑制过拟合 1

简介: 【深度学习】实验13 使用Dropout抑制过拟合

使用Dropout抑制过拟合

Dropout是一种常用的神经网络正则化方法,主要用于防止过拟合。在深度学习中,由于网络层数过多,参数数量庞大,模型容易过拟合,并且在测试时产生较大的泛化误差。Dropout方法借鉴了集成学习中的Bagging思想,通过随机的方式,将一部分神经元的输出设置为0,从而减少过拟合的可能。


Dropout方法最早由Hinton等人提出,其基本思想是在训练时,以一定的概率随机地将网络中某些神经元的输出置为0。这种随机的行为可以被看作是一种对网络进行了部分剪枝,从而增加了网络的容忍性,使网络更加健壮,同时也避免了网络中某些特定的神经元对整个网络的过度依赖。


Dropout方法的具体实现如下:在每次训练过程中,以一定的概率p随机选择一部分神经元并将其置为0,被选择的神经元不参与后续的训练和反向传播。在测试时,为了保持模型的稳定性和一致性,一般不会采取随机化的方式,而是将每个神经元的权重乘以概率p,这里的p是在训练时选择的那个概率。


Dropout方法不仅可用于全连接网络,也可用于卷积神经网络和循环神经网络中,以减少过拟合现象。并且,它的实现简单,仅需要在模型训练时对每个神经元以概率p随机地进行挑选和保留,所以Dropout方法得到了广泛的应用和推广。


总之,Dropout方法可以在一定程度上提高模型的准确性和泛化能力,对于防止过拟合有着较好的效果。但是需要注意的是,Dropout方法会导致训练过程中每个mini-batch的梯度都不同,所以在使用Dropout方法时需要调整学习率,以保证模型的收敛速度和效果。

1. 环境准备

# 导入库
import keras
from keras import layers
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Using TensorFlow backend.

2. 导入数据集

# 导入数据集
data = pd.read_csv('./dataset/credit-a.csv', header=None)
data

0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0 30.83 0.000 0 0 9 0 1.250 0 0 1 1 0 202 0.0 -1
1 1 58.67 4.460 0 0 8 1 3.040 0 0 6 1 0 43 560.0 -1
2 1 24.50 0.500 0 0 8 1 1.500 0 1 0 1 0 280 824.0 -1
3 0 27.83 1.540 0 0 9 0 3.750 0 0 5 0 0 100 3.0 -1
4 0 20.17 5.625 0 0 9 0 1.710 0 1 0 1 2 120 0.0 -1
5 0 32.08 4.000 0 0 6 0 2.500 0 1 0 0 0 360 0.0 -1
6 0 33.17 1.040 0 0 7 1 6.500 0 1 0 0 0 164 31285.0 -1
7 1 22.92 11.585 0 0 2 0 0.040 0 1 0 1 0 80 1349.0 -1
8 0 54.42 0.500 1 1 5 1 3.960 0 1 0 1 0 180 314.0 -1
9 0 42.50 4.915 1 1 9 0 3.165 0 1 0 0 0 52 1442.0 -1
10 0 22.08 0.830 0 0 0 1 2.165 1 1 0 0 0 128 0.0 -1
11 0 29.92 1.835 0 0 0 1 4.335 0 1 0 1 0 260 200.0 -1
12 1 38.25 6.000 0 0 5 0 1.000 0 1 0 0 0 0 0.0 -1
13 0 48.08 6.040 0 0 5 0 0.040 1 1 0 1 0 0 2690.0 -1
14 1 45.83 10.500 0 0 8 0 5.000 0 0 7 0 0 0 0.0 -1
15 0 36.67 4.415 1 1 5 0 0.250 0 0 10 0 0 320 0.0 -1
16 0 28.25 0.875 0 0 6 0 0.960 0 0 3 0 0 396 0.0 -1
17 1 23.25 5.875 0 0 8 0 3.170 0 0 10 1 0 120 245.0 -1
18 0 21.83 0.250 0 0 1 1 0.665 0 1 0 0 0 0 0.0 -1
19 1 19.17 8.585 0 0 2 1 0.750 0 0 7 1 0 96 0.0 -1
20 0 25.00 11.250 0 0 0 0 2.500 0 0 17 1 0 200 1208.0 -1
21 0 23.25 1.000 0 0 0 0 0.835 0 1 0 1 2 300 0.0 -1
22 1 47.75 8.000 0 0 0 0 7.875 0 0 6 0 0 0 1260.0 -1
23 1 27.42 14.500 0 0 10 1 3.085 0 0 1 1 0 120 11.0 -1
24 1 41.17 6.500 0 0 8 0 0.500 0 0 3 0 0 145 0.0 -1
25 1 15.83 0.585 0 0 0 1 1.500 0 0 2 1 0 100 0.0 -1
26 1 47.00 13.000 0 0 3 2 5.165 0 0 9 0 0 0 0.0 -1
27 0 56.58 18.500 0 0 1 2 15.000 0 0 17 0 0 0 0.0 -1
28 0 57.42 8.500 0 0 11 1 7.000 0 0 3 1 0 0 0.0 -1
29 0 42.08 1.040 0 0 9 0 5.000 0 0 6 0 0 500 10000.0 -1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
623 1 28.58 3.750 0 0 0 0 0.250 1 0 1 0 0 40 154.0 1
624 0 22.25 9.000 0 0 12 0 0.085 1 1 0 1 0 0 0.0 1
625 0 29.83 3.500 0 0 0 0 0.165 1 1 0 1 0 216 0.0 1
626 1 23.50 1.500 0 0 9 0 0.875 1 1 0 0 0 160 0.0 1
627 0 32.08 4.000 1 1 2 0 1.500 1 1 0 0 0 120 0.0 1
628 0 31.08 1.500 1 1 9 0 0.040 1 1 0 1 2 160 0.0 1
629 0 31.83 0.040 1 1 6 0 0.040 1 1 0 1 0 0 0.0 1
630 1 21.75 11.750 0 0 0 0 0.250 1 1 0 0 0 180 0.0 1
631 1 17.92 0.540 0 0 0 0 1.750 1 0 1 0 0 80 5.0 1
632 0 30.33 0.500 0 0 1 1 0.085 1 1 0 0 2 252 0.0 1
633 0 51.83 2.040 1 1 13 7 1.500 1 1 0 1 0 120 1.0 1
634 0 47.17 5.835 0 0 9 0 5.500 1 1 0 1 0 465 150.0 1
635 0 25.83 12.835 0 0 2 0 0.500 1 1 0 1 0 0 2.0 1
636 1 50.25 0.835 0 0 12 0 0.500 1 1 0 0 0 240 117.0 1
637 1 37.33 2.500 0 0 3 1 0.210 1 1 0 1 0 260 246.0 1
638 1 41.58 1.040 0 0 12 0 0.665 1 1 0 1 0 240 237.0 1
639 1 30.58 10.665 0 0 8 1 0.085 1 0 12 0 0 129 3.0 1
640 0 19.42 7.250 0 0 6 0 0.040 1 0 1 1 0 100 1.0 1
641 1 17.92 10.210 0 0 13 7 0.000 1 1 0 1 0 0 50.0 1
642 1 20.08 1.250 0 0 0 0 0.000 1 1 0 1 0 0 0.0 1
643 0 19.50 0.290 0 0 5 0 0.290 1 1 0 1 0 280 364.0 1
644 0 27.83 1.000 1 1 1 1 3.000 1 1 0 1 0 176 537.0 1
645 0 17.08 3.290 0 0 3 0 0.335 1 1 0 0 0 140 2.0 1
646 0 36.42 0.750 1 1 1 0 0.585 1 1 0 1 0 240 3.0 1
647 0 40.58 3.290 0 0 6 0 3.500 1 1 0 0 2 400 0.0 1
648 0 21.08 10.085 1 1 11 1 1.250 1 1 0 1 0 260 0.0 1
649 1 22.67 0.750 0 0 0 0 2.000 1 0 2 0 0 200 394.0 1
650 1 25.25 13.500 1 1 13 7 2.000 1 0 1 0 0 200 1.0 1
651 0 17.92 0.205 0 0 12 0 0.040 1 1 0 1 0 280 750.0 1
652 0 35.00 3.375 0 0 0 1 8.290 1 1 0 0 0 0 0.0 1

653 rows × 16 columns

data.iloc[:, -1].unique()
array([-1,  1])

3. 对所有数据的预测

3.1 数据集

x = data.iloc[:, :-1].values
y = data.iloc[:, -1].replace(-1, 0).values.reshape(-1, 1)
x.shape, y.shape
((653, 15), (653, 1))

3.2 构建神经网络

model = keras.Sequential()
model.add(layers.Dense(128, input_dim=15, activation='relu'))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 128)               2048      
_________________________________________________________________
dense_2 (Dense)              (None, 128)               16512     
_________________________________________________________________
dense_3 (Dense)              (None, 128)               16512     
_________________________________________________________________
dense_4 (Dense)              (None, 1)                 129       
=================================================================
Total params: 35,201
Trainable params: 35,201
Non-trainable params: 0
_________________________________________________________________
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['acc']
)
WARNING:tensorflow:From /home/nlp/anaconda3/lib/python3.7/site-packages/tensorflow/python/ops/nn_impl.py:180: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where

3.3 训练模型

history = model.fit(x, y, epochs=1000)
WARNING:tensorflow:From /home/nlp/anaconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:422: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.
Epoch 1/1000
653/653 [==============================] - 0s 434us/step - loss: 7.5273 - acc: 0.5988
Epoch 2/1000
653/653 [==============================] - 0s 92us/step - loss: 3.7401 - acc: 0.6187
Epoch 3/1000
653/653 [==============================] - 0s 75us/step - loss: 3.6464 - acc: 0.5712
Epoch 4/1000
653/653 [==============================] - 0s 56us/step - loss: 10.2291 - acc: 0.6631
Epoch 5/1000
653/653 [==============================] - 0s 63us/step - loss: 2.0400 - acc: 0.6233
Epoch 6/1000
653/653 [==============================] - 0s 120us/step - loss: 2.4279 - acc: 0.6217
Epoch 7/1000
653/653 [==============================] - 0s 105us/step - loss: 2.3289 - acc: 0.6325
Epoch 8/1000
653/653 [==============================] - 0s 159us/step - loss: 3.2521 - acc: 0.6294
Epoch 9/1000
653/653 [==============================] - 0s 89us/step - loss: 2.6005 - acc: 0.6294
Epoch 10/1000
653/653 [==============================] - 0s 118us/step - loss: 1.3997 - acc: 0.6738
……
Epoch 1000/1000
653/653 [==============================] - 0s 106us/step - loss: 0.2630 - acc: 0.9326

3.4 分析模型

history.history.keys()
dict_keys(['loss', 'acc'])
plt.plot(history.epoch, history.history.get('loss'), c='r')
plt.plot(history.epoch, history.history.get('acc'), c='b')
[<matplotlib.lines.Line2D at 0x7fd43c1597f0>]

4. 对未见过数据的预测

4.1 划分数据集

x_train = x[:int(len(x)*0.75)]
x_test = x[int(len(x)*0.75):]
y_train = y[:int(len(x)*0.75)]
y_test = y[int(len(x)*0.75):]
x_train.shape, x_test.shape, y_train.shape, y_test.shape
((489, 15), (164, 15), (489, 1), (164, 1))

4.2 构建神经网络

model = keras.Sequential()
model.add(layers.Dense(128, input_dim=15, activation='relu'))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
#admam:利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率.
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['acc']
)


目录
相关文章
|
6月前
|
机器学习/深度学习 自然语言处理
深度学习中的正则化技术:防止过拟合的利器
在深度学习领域,模型的复杂度往往与其性能成正比,但过高的复杂度也容易导致过拟合现象。本文将深入探讨正则化技术在深度学习中的应用,分析其如何通过引入额外信息或限制来优化模型,从而在保持模型复杂度的同时,有效避免过拟合问题。我们将通过具体实例和数据,展示正则化技术的实际效果,并讨论其在不同场景下的应用策略。
|
4月前
|
机器学习/深度学习 算法框架/工具
深度学习中的正则化技术:防止过拟合的利器
【9月更文挑战第20天】在探索深度学习模型的无限可能性时,我们不得不面对一个常见的挑战——过拟合。本文将深入探讨如何通过正则化技术来对抗这一难题,包括L1和L2正则化、Dropout以及数据增强等方法。我们将以简明的语言和直观的比喻,带领您了解这些技术如何在训练过程中发挥作用,并展示一些实用的代码片段,帮助您在自己的项目中实现它们。
|
2月前
|
机器学习/深度学习
深度学习中的正则化技术:防止过拟合的利器
【10月更文挑战第30天】本文将深入探讨深度学习中一个关键概念——正则化,它如同园艺师精心修剪枝叶,确保模型不至于在训练数据的细节中迷失方向。我们将从直观的角度理解正则化的重要性,并逐步介绍几种主流的正则化技术,包括L1和L2正则化、Dropout以及数据增强。每种技术都将通过实际代码示例来展示其应用,旨在为读者提供一套完整的工具箱,以应对深度学习中的过拟合问题。
|
5月前
|
机器学习/深度学习 算法框架/工具 Python
过拟合的终结者:深度学习中的正则化技术,如何成为模型泛化能力的超级英雄
【8月更文挑战第7天】深度学习模型虽强大却易过拟合,尤其是在数据有限时。正则化技术通过在训练中引入惩罚项来提升模型泛化能力。L2正则化(权重衰减)限制权重大小;L1正则化生成稀疏权重。例如,在Keras中可通过`kernel_regularizer=regularizers.l2(0.01)`实现L2正则化。Dropout通过随机丢弃神经元减少共适应。数据增强增加训练数据多样性。此外,标签平滑和最大模态正则化等新策略进一步增强了模型的泛化能力。
84 0
|
7月前
|
机器学习/深度学习 自然语言处理
深度学习中的正则化技术:防止过拟合的策略
深度学习模型因其强大的特征提取能力而广受关注,但复杂的网络结构也容易陷入过拟合的困境。本文将探讨如何通过正则化技术来缓解这一问题,包括L1和L2正则化、Dropout、数据增强以及早停等方法。文章将详细解释每种技术的工作原理,并讨论它们在实际应用中的效果与挑战。
|
3月前
|
机器学习/深度学习 监控 数据可视化
深度学习中实验、观察与思考的方法与技巧
在深度学习中,实验、观察与思考是理解和改进模型性能的关键环节。
66 5
|
3月前
|
机器学习/深度学习 数据挖掘 知识图谱
深度学习之材料科学中的自动化实验设计
基于深度学习的材料科学中的自动化实验设计是一个新兴领域,旨在通过机器学习模型,尤其是深度学习模型,来优化和自动化材料实验的设计流程。
67 1
|
4月前
|
机器学习/深度学习
深度学习中的正则化技术:防止过拟合的利器
在深度学习的探索之旅中,模型的性能往往受限于一个隐形的敌人——过拟合。本文通过深入浅出的方式,探讨了如何运用正则化技术这一护盾,保护我们的模型免受过拟合之害。从L1和L2正则化的基本概念出发,到深入理解Dropout和数据增强等高级技巧,我们将一起构建起防御过拟合的坚固堡垒。
|
5月前
|
机器学习/深度学习 监控
深度学习中的正则化技术:防止过拟合与提升泛化能力
【8月更文挑战第6天】在深度学习领域,模型的复杂性往往与其性能成正比,但同时也带来了过拟合的风险。本文将深入探讨正则化技术在深度学习中的应用,如何通过这些技术平衡模型复杂度与泛化能力,以及它们对模型性能的具体影响。我们将从理论到实践,分析不同正则化方法的优势和局限,为深度学习研究者和实践者提供指导。
173 10
|
5月前
|
机器学习/深度学习 存储 算法框架/工具
【深度学习】猫狗识别TensorFlow2实验报告
本文介绍了使用TensorFlow 2进行猫狗识别的实验报告,包括实验目的、采用卷积神经网络(CNN)进行训练的过程,以及如何使用交叉熵作为损失函数来识别猫狗图像数据集。
213 1

相关实验场景

更多