深度学习之 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数据集下载

 ➢ 批量读取数据,采用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)

 

(3)代码实现

➢ 模型参数定义及初始化

 

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

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

 

 

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

 ➢ 定义模型训练函数

➢ 训练模型

⚫ 设置训练轮次为10轮 

⚫ 学习率为0.1

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

 

 

 Torch.nn实现前馈神经网络

(3)代码实现

➢ 实现FlattenLayer层 

➢ 模型定义和参数初始化

 

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

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

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

➢ 训练结果和loss曲线绘制 

 ➢ 绘制loss曲线

 模型调优

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

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

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

◼ 常用划分方法:

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

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

        ➢ 自助法:自助采样

(1)实验数据划分

◼ 手动实现K折交叉验证

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

 ➢ 创建数据集

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

 

➢ 数据划分示例

 

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

一个大概的框架:

 

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

 过拟合

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

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

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

◼ 欠拟合

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

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

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

 

 

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

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

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

➢ 定义作图函数Draw_Loss_Curve

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

体会:

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

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

 

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

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

 

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

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

 

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

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

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

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

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

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

➢ 生成数据集

 

◼ 手动实现𝑳𝟐范数正则化

◼ 手动实现𝑳𝟐范数正则化

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

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

➢ 定义模型

➢ 定义训练函数 

 

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

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

➢ 定义训练函数

 

 

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

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

 

 

◼ 手动实现dropout

◼ 手动实现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

 利用torch.nn.Dropout层实现dropout

➢ 定义模型

 

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

 

➢ 实验结果

 

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
手动实现前馈神经网络的关键步骤如下: 1. 首先,需要定义模型。在手动实现中,可以使用Python编程语言来定义模型模型的定义包括输入层的特征数、隐藏层的个数和隐藏单元的个数,以及输出层的神经元个数。在定义模型时,可以使用ReLU激活函数来激活隐藏层的输出。 2. 在定义模型后,需要进行训练。训练模型的过程包括设置学习率、迭代次数和批量大小等参数。然后,使用训练数据集进行迭代训练,通过计算损失函数来更新模型的参数。在每个epoch后,可以计算训练集和测试集的损失,并将其保存到列表中。 3. 最后,可以使用训练好的模型进行预测。预测的过程包括将输入数据传入模型中,通过前向传播计算输出结果。 综上所述,手动实现前馈神经网络的过程包括定义模型、训练模型和预测。在定义模型时,需要设置输入层的特征数、隐藏层的个数和隐藏单元的个数,以及输出层的神经元个数。在训练模型时,需要设置学习率、迭代次数和批量大小等参数,并使用训练数据集进行迭代训练。最后,可以使用训练好的模型进行预测。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [pytorch实现前馈神经网络实验(手动实现)](https://blog.csdn.net/qq_37534947/article/details/109394648)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值