上一篇我们了解了前馈神经网络的基础概念知识之后,本文来实现前馈神经网络。本文是接着上一篇深度学习之 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
采用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(短靴)。
采用torch.utils.data.DataLoader读取小批量数据:
batch_size是超参数,表示一轮训练多少个样本
shuffle是否打乱数据,True表示打乱数据
num_workers=0表示不开启多线程读取数据
- 输出层神经元个数:10(对应10个类别) W2∈R10*256
- 隐藏层神经元个数:256 W1∈R256*784
- 输入神经元个数:784 (每个样本是28*28*1)
⚫ 设置训练轮次为10轮
⚫ 学习率为0.1
⚫ 优化器采用默认的SGD函数
◼ 训练过程中所用样本:训练集 —— 经验误差 → 经验误差最小化
◼ 进行预测中所用样本:测试集 —— 测试误差 ...… 泛化误差最小化
◼ 训练集与测试集应尽可能互斥
◼ 常用划分方法:
➢ 留出法:对于数据集D,SUT=D,S∩T=Φ
➢ 交叉验证法:将数据集D分成大小相似的K个互斥子集,然后每次用其中的K-1份训练,1份测试
➢ 自助法:自助采样
K折交叉验证:将数据集分层采样划分为k个大小相似的互斥子集,每次用k-1个子集的并集作为训练集,余下的子集作为测试集,最终返回k个测试结果的均值,k 最常用的取值是10。
➢ 创建数据集
➢ 获取k折交叉验证某一折的训练集和验证集
➢ 数据划分示例
➢ 依次对每一折数据进行训练和测试,并计算k折平均值
一个大概的框架:
◼ 过拟合
⚫ 表现:模型在训练集上正确率很高,但是在测试集上正确率很低
⚫ 造成原因:由于训练数据少和噪声以及模型能力强等原因造成的过拟合
⚫ 解决办法:优化目标加正则项;Dropout;早停机制
◼ 欠拟合
⚫ 表现:模型在训练集和测试集上的正确率都很低
⚫ 造成原因:由于模型能力不足造成的
⚫ 解决办法:增加模型复杂度
◼ 给定样本特征,使用如下的三阶多项式函数来生成样本的标签
➢ 形成数据集:设置噪声项服从均值为0、标准差为0.1的正态分布。训练数据集和测试数据集的样本数都设为100
➢ 定义作图函数Draw_Loss_Curve
➢ 模型定义和训练函数定义
体会:
◼ 使用三阶多项式函数拟合(理想)
➢ 使用与数据生成函数同阶的三阶多项式函数拟合,学习到的模型参数接近真实值
◼ 使用线性函数拟合(用线性去拟合三阶的:欠拟合)
➢ 将模型复杂度降低:使用线性函数。训练集和测试集的loss在后期均很难下降,出现欠拟合
◼ 训练样本过少(过拟合)
➢ 只使用两个样本来训练模型,训练集loss持续下降,测试集loss上升,出现了过拟合
⚫ 在模型原损失函数基础上添加2范数惩罚项,通过惩罚绝对值较大的模型参数为需要学习的模型增加限制,来应对过拟合问题。带有2范数惩罚项的模型的新损失函数为:
其中w是参数向量, 是模型原损失函数,n是样本个数, 是超参数
◼ 以高维线性回归为例来引入一个过拟合问题,并使用权重衰减来应对过拟合设数据样本特征的维度为p,使用如下函数生成样本的标签:
其中噪声项服从均值为0、标准差为0.01的正态分布。设p=200,设置训练集样本数为20,测试集样本数位100来引入过拟合的情况。
➢ 生成数据集
◼ 手动实现范数正则化
➢ 定义随机初始化模型参数的函数,均方误差
➢ 定义2范数惩罚项,随机梯度下降函数
➢ 定义模型
◼ 利用torch.optim的weight_decay参数实现范数正则化
➢ 定义训练函数
每次选择丢弃的神经元是随机的。最简单的方法是设置一个固定的概率 p。对每一个神经元都以概率p来判定要不要保留。
◼ 手动实现dropout
以前馈神经网络为例,当使用dropout时,前馈神经网络隐藏层中的隐藏单元ℎ有一定概率被丢弃掉。
➢ 设丢弃概率为p, 那么有p的概率会被清零,有1−p的概率会除以1−p做拉伸。由此定义进行dropout操作的函数
➢ 初始化一个向量X,对X进行dropout,分别设置丢弃率为0、0.5、1,实验结果如下:
➢ 定义模型参数(使用Fashion-MNIST数据集进行实验)
➢ 定义使用dropout的网络模型,两个隐藏层的丢弃率分别为0.2和0.5
➢ 定义计算准确率的函数
➢ 训练模型的部分与1.5中相同,此处不再赘述。实验结果如下
◼ 利用torch.nn.Dropout层实现dropout
➢ 定义模型
➢ 定义计算准确率的函数(eval()和train()来切换模型的状态)
➢ 实验结果