深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优

上一篇我们了解了前馈神经网络的基础概念知识之后,本文来实现前馈神经网络。本文是接着上一篇深度学习之 9 前馈神经网络 基本概念_水w的博客-CSDN博客

目录

手动实现前馈神经网络

(1)数据集介绍

➢ Fashion-MNIST数据集下载

 ➢ 批量读取数据,采用torch.utils.data.DataLoader读取小批量数据

(2)模型设计(包含一个隐藏层)

(3)代码实现

➢ 模型参数定义及初始化

➢ 定义激活函数,我们选用ReLU作为激活函数

➢ 定义模型,随机梯度下降函数,交叉熵损失函数,

➢ 计算模型在某个数据集上的准确率

 ➢ 定义模型训练函数

➢ 训练模型

 Torch.nn实现前馈神经网络

(3)代码实现

➢ 实现FlattenLayer层 

➢ 模型定义和参数初始化

➢ 计算模型在某个数据集上的准确率和loss

➢ 设置训练轮次、学习率、损失函数和优化器

 ➢ 模型训练,保存训练集和验证集的loss

➢ 训练结果和loss曲线绘制 

 ➢ 绘制loss曲线

 模型调优

(1)实验数据划分

◼ 手动实现K折交叉验证

(2) 模型选择、欠拟合、过拟合

◼ 多项式函数拟合实验探究影响欠拟合、过拟合的因素

(3)过拟合问题的常用方法——L 2 范数正则化

◼ 以高维线性回归为例来引入一个过拟合问题

◼ 手动实现范数正则化

◼ 利用torch.optim的weight_decay参数实现范数正则化

(4)应对过拟合问题的常用方法——Dropout

◼ 手动实现dropout

◼ 利用torch.nn.Dropout层实现dropout


手动实现前馈神经网络

(1)数据集介绍

采用Fashion-MNIST数据集完成多分类任务。

  • 训练集:60,000 测试集:10,000
  • 每个样本的数据格式为:28*28*1(高*宽*通道)
  • Fashion-MNIST中包含的10个类别分别为:
    • t-shirt(T恤)、trouser(裤⼦)、pullover(套衫)、dress(连⾐裙)、
    • coat(外套)、sandal(凉鞋)、shirt(衬衫)、sneaker(运动鞋)、bag(包)和ankle boot(短靴)。

➢ Fashion-MNIST数据集下载

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第1张图片

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第2张图片

 ➢ 批量读取数据,采用torch.utils.data.DataLoader读取小批量数据

采用torch.utils.data.DataLoader读取小批量数据:

        batch_size是超参数,表示一轮训练多少个样本

        shuffle是否打乱数据,True表示打乱数据

        num_workers=0表示不开启多线程读取数据

 

(2)模型设计(包含一个隐藏层)

  • 输出层神经元个数:10(对应10个类别) W2∈R10*256
  • 隐藏层神经元个数:256  W1∈R256*784
  • 输入神经元个数:784 (每个样本是28*28*1)

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第3张图片

 

(3)代码实现

➢ 模型参数定义及初始化

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第4张图片 

➢ 定义激活函数,我们选用ReLU作为激活函数

➢ 定义模型,随机梯度下降函数,交叉熵损失函数,

 

 

➢ 计算模型在某个数据集上的准确率

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第5张图片

 ➢ 定义模型训练函数

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第6张图片

➢ 训练模型

⚫ 设置训练轮次为10轮 

⚫ 学习率为0.1

⚫ 优化器采用默认的SGD函数

 深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第7张图片

 

 Torch.nn实现前馈神经网络

(3)代码实现

➢ 实现FlattenLayer层 

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第8张图片

➢ 模型定义和参数初始化

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第9张图片 

➢ 计算模型在某个数据集上的准确率和loss

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第10张图片

➢ 设置训练轮次、学习率、损失函数和优化器

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第11张图片

 ➢ 模型训练,保存训练集和验证集的loss

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第12张图片

➢ 训练结果和loss曲线绘制 

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第13张图片

 ➢ 绘制loss曲线

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第14张图片

 模型调优

◼ 训练过程中所用样本:训练集 —— 经验误差     → 经验误差最小化

◼ 进行预测中所用样本:测试集 —— 测试误差 ...… 泛化误差最小化

◼ 训练集与测试集应尽可能互斥

◼ 常用划分方法:

        ➢ 留出法:对于数据集D,SUT=D,S∩T=Φ 

        ➢ 交叉验证法:将数据集D分成大小相似的K个互斥子集,然后每次用其中的K-1份训练,1份测试

        ➢ 自助法:自助采样

(1)实验数据划分

◼ 手动实现K折交叉验证

K折交叉验证:将数据集分层采样划分为k个大小相似的互斥子集,每次用k-1个子集的并集作为训练集,余下的子集作为测试集,最终返回k个测试结果的均值,k 最常用的取值是10。 

 ➢ 创建数据集

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第15张图片

➢ 获取k折交叉验证某一折的训练集和验证集

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第16张图片 

➢ 数据划分示例

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第17张图片 

➢ 依次对每一折数据进行训练和测试,并计算k折平均值

一个大概的框架:

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第18张图片 

(2) 模型选择、欠拟合、过拟合

 过拟合

        ⚫ 表现:模型在训练集上正确率很高,但是在测试集上正确率很低

        ⚫ 造成原因:由于训练数据少和噪声以及模型能力强等原因造成的过拟合

        ⚫ 解决办法:优化目标加正则项;Dropout;早停机制

◼ 欠拟合

        ⚫ 表现:模型在训练集和测试集上的正确率都很低

        ⚫ 造成原因:由于模型能力不足造成的

        ⚫ 解决办法:增加模型复杂度

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第19张图片深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第20张图片

 

 

 多项式函数拟合实验探究影响欠拟合、过拟合的因素

◼ 给定样本特征,使用如下的三阶多项式函数来生成样本的标签

➢ 形成数据集:设置噪声项服从均值为0、标准差为0.1的正态分布。训练数据集和测试数据集的样本数都设为100

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第21张图片

➢ 定义作图函数Draw_Loss_Curve

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第22张图片

➢ 模型定义和训练函数定义

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第23张图片

体会:

◼ 使用三阶多项式函数拟合(理想)

➢ 使用与数据生成函数同阶的三阶多项式函数拟合,学习到的模型参数接近真实值

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第24张图片

 

◼ 使用线性函数拟合(用线性去拟合三阶的:欠拟合) 

➢ 将模型复杂度降低:使用线性函数。训练集和测试集的loss在后期均很难下降,出现欠拟合

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第25张图片

 

◼ 训练样本过少(过拟合) 

➢ 只使用两个样本来训练模型,训练集loss持续下降,测试集loss上升,出现了过拟合

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第26张图片

 

(3)过拟合问题的常用方法——L 2 范数正则化

⚫ 在模型原损失函数基础上添加2范数惩罚项,通过惩罚绝对值较大的模型参数为需要学习的模型增加限制,来应对过拟合问题。带有2范数惩罚项的模型的新损失函数为: 

其中w是参数向量, 是模型原损失函数,n是样本个数, 是超参数

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第27张图片

◼ 以高维线性回归为例来引入一个过拟合问题

◼ 以高维线性回归为例来引入一个过拟合问题,并使用权重衰减来应对过拟合设数据样本特征的维度为p,使用如下函数生成样本的标签:

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第28张图片

 其中噪声项服从均值为0、标准差为0.01的正态分布。设p=200,设置训练集样本数为20,测试集样本数位100来引入过拟合的情况。 

➢ 生成数据集

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第29张图片

 

◼ 手动实现范数正则化

◼ 手动实现范数正则化

➢ 定义随机初始化模型参数的函数,均方误差

➢ 定义2范数惩罚项,随机梯度下降函数

➢ 定义模型

➢ 定义训练函数深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第30张图片 

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第31张图片

 

◼ 利用torch.optim的weight_decay参数实现范数正则化

◼ 利用torch.optim的weight_decay参数实现范数正则化

➢ 定义训练函数

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第32张图片

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第33张图片 

 

(4)应对过拟合问题的常用方法——Dropout

每次选择丢弃的神经元是随机的。最简单的方法是设置一个固定的概率 p。对每一个神经元都以概率p来判定要不要保留。

 深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第34张图片

 

◼ 手动实现dropout

◼ 手动实现dropout

以前馈神经网络为例,当使用dropout时,前馈神经网络隐藏层中的隐藏单元ℎ有一定概率被丢弃掉。 

➢ 设丢弃概率为p, 那么有p的概率会被清零,有1−p的概率会除以1−p做拉伸。由此定义进行dropout操作的函数

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第35张图片

 ➢ 初始化一个向量X,对X进行dropout,分别设置丢弃率为0、0.5、1,实验结果如下:

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第36张图片

➢ 定义模型参数(使用Fashion-MNIST数据集进行实验) 

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第37张图片

➢ 定义使用dropout的网络模型,两个隐藏层的丢弃率分别为0.2和0.5

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第38张图片

➢ 定义计算准确率的函数

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第39张图片

➢ 训练模型的部分与1.5中相同,此处不再赘述。实验结果如下

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第40张图片

◼ 利用torch.nn.Dropout层实现dropout

 利用torch.nn.Dropout层实现dropout

➢ 定义模型

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第41张图片 

➢ 定义计算准确率的函数(eval()和train()来切换模型的状态)

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第42张图片 

➢ 实验结果

深度学习之 9 前馈神经网络2:实现前馈神经网络,模型调优_第43张图片 

你可能感兴趣的:(#,深度学习,深度学习,神经网络,人工智能,python)