多层感知机的简洁实现以及模型训练的一些基础知识(李沐Pytorch)

本文介绍了如何使用PyTorch构建一个简单的前馈神经网络,用于FashionMNIST数据集的图像分类。详细讲解了网络结构、参数初始化、超参数的选择,以及训练过程中的关键步骤,包括数据处理、损失计算、反向传播和防止过拟合的方法。
摘要由CSDN通过智能技术生成
# 导入包
import torch
from torch import nn
from d2l import torch as d2l
#定义网络,前馈神经网络,适用于图像分类。
#输入图像首先被展平,之后通过两个全连接层,中间使用激活函数ReLU,最后输出具有10个类别的概率分布。
net = nn.Sequential(nn.Flatten(),  # 将输入的图片展平成一维向量
                    nn.Linear(784, 256),#线性层,输入大小为784.输出大小为256
                    nn.ReLU(),  # ReLU激活函数,所有负值置0,保持正值不变。引入非线性性质,有助于网络学习复杂的函数
                    nn.Linear(256, 10))  # 第二层,接收长度为256的,并将其转换为长度为10的输出向量。对应Fashion MNIST数据集中的类别数量

def init_weights(m):  # 初始化参数
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)  # m.weight未初始化之前是0

net.apply(init_weights)   # 网络的每一层的权值都进行初始化

batch_size, lr, num_epochs = 256, 0.1, 10  # 一些超参数
loss = nn.CrossEntropyLoss(reduction='mean') # 交叉熵损失函数
trainer = torch.optim.SGD(net.parameters(), lr=lr)  # 训练器,也就是优化器,选择随机梯度下降

train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)  # 开始训练
d2l.plt.show()  # 显示训练进程

模型的参数是什么?

定义: 模型参数是指模型内部学习的权重和偏差,它们是通过训练数据自动学习得到的。

特点:模型参数的值是根据训练数据调整的,目标是使模型能够最好地拟合训练数据,从而提高模型的性能。

示例:在线性回归中,模型参数包括权重(斜率)和偏差(截距)

超参数是什么?

定义: 超参数是在训练模型之前设置的,它们不是通过训练数据学习得到的,而是在模型训练之前手动选择的。

特点:超参数的值影响着模型的学习过程,但它们不是通过训练数据调整的。选择合适的超参数对于模型的性能和泛化能力至关重要。

示例:在神经网络中,学习率、隐藏层的数量和大小等都是超参数。

超参数:

1.batch_size:训练中每个批次中包含的样本数量。在每个训练步骤中,模型会计算损失并更新参数(这里的参数指的是神经网络中的权重w和偏置b)的梯度,这个过程是基于每个批次的数据进行的。较大的batch_size可以提高训练效率,但也可能会导致内存不足或者训练不稳定

2.lr(Learing rate):学习率是一个控制模型参数更新步长的参数。它决定了每次参数更新中应该沿梯度的方向移动多远。较小的学习率可能会导致模型的训练过慢。较大的学习率可能导致模型在损失曲面上跳动。

3.num_epochs:这是整个训练数据集被遍历的次数,也成为训练的轮数。适当的epoch应该让模型学习到足够的数据而不过拟合。

上述模型训练步骤的基本流程:

1.接收数据:模型接收一个批次的输入数据

2.前向传播:通过前向传播计算模型的预测输出

3.损失计算:计算预测输出与实际标签之间的损失

4.反向传播:通过反向传播计算损失相对于模型参数的梯度

5.参数更新:使用优化算法(如随机梯度下降)根据梯度更新模型的参数,以减少损失。

6.重复:重复以上步骤,处理下一个batch_size的数据,直至处理完整个训练的数据集。这称为一个epoch

这个过程通过多次迭代,通过不断地调整模型参数,使得模型逐渐学到数据的特征,从而提高在新数据上的泛化能力。

训练的结束时机:

1.固定的迭代次数(Epochs):设置一个预定义的迭代次数,当达到这个次数后结束训练。上面的代码就是固定epochs=10。要将整个训练集,进行10次训练。

2.早停(Early Stopping):监测验证集的性能,并在性能不再提升时停止训练。这是为了避免过度拟合,当模型在训练数据上表现得很好但在验证数据上表现不佳时(过拟合),说明模型可能过度拟合了训练数据。

3.损失收敛: 监测损失值,当损失值收敛到一个足够小的值时,可以认为模型已经足够拟合数据,训练结束

4.性能指标达标: 当模型在验证集或测试集上的性能达到预先定义的标准时,结束训练。

防止过拟合的方法:

1.使用验证集和早停(Early Stopping):监测模型在验证集上的性能,当性能不再提升时停止训练,避免过拟合。

2.正则化(Regularization):添加正则化项,限制模型参数的大小,防止模型过于复杂。

3.数据增强:对训练数据进行一些随机变换,增加数据的多样性,有助于模型更好地泛化。

4.减少模型复杂度:考虑使用简单的模型结构,避免过度拟合。

参数更新

在典型的随机梯度下降(Stochastic Gradient Descent,SGD)中,模型会在处理完每个batch_size的数据后计算损失并更新模型参数。

1.Batch Gradient Descent(批量梯度下降): 在每个 epoch 中使用整个训练数据集计算梯度和更新参数。这意味着在整个数据集上计算损失后才进行一次参数更新。

2.Mini-Batch Gradient Descent(小批量梯度下降): 使用一个小批量(而不是整个数据集)的数据计算梯度和更新参数。这是 SGD 的一种折中,可以更频繁地更新参数,同时减少计算的复杂性。

3.Online Learning(在线学习): 在处理每个样本后就更新参数。这是一种极端情况,适用于处理流数据或非常大的数据集。

4.动量(Momentum): 动量优化算法会考虑之前的梯度信息,以更平滑地更新参数。

5.Adagrad、RMSprop、Adam 等优化算法: 这些算法引入了不同的参数更新规则,考虑了梯度的历史信息以及自适应学习率的调整。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值