1.从零设计并训练一个神经网络https://www.bilibili.com/video/BV134421U77t/?spm_id_from=333.337.search-card.all.click&vd_source=0b1f472915ac9cb9cdccb8658d6c2e69
一、如何设计、实现并训练一个标准的前馈神经网络,用于手写数字图像的分类,重点讲解了神经网络的设计和实现、数据的准备和处理、模型的训练和测试流程。
- 以数字图像作为输入,神经网络计算并识别图像中的数字。
- 输入层包含784个神经元,隐藏层用于特征提取,输出层包含10个神经元。
- 输出层的输出输入到soft max层,将十维的向量转换为十个概率值。
二、神经网络的设计思路和实现方法,以及手写数字识别的数据处理流程和代码实现,包括图像预处理、构建数据集等。
- 神经网络设计思路:每个概率值对应一个数字
- 手写数字识别训练数据:使用mini数据集
- 数据处理流程:图像预处理、读取数据文件夹、构建数据集
三、使用PyTorch进行图像分类的步骤,包括读取数据、构建数据集、小批量数据读取、模型训练等,以及涉及到的对象和损失函数等。
- 1、读取数据、构建数据集
- 2、模型的训练
- 使用train loader进行小批量数据读入,创建模型、优化器和损失函数进行训练
- 训练模型的循环迭代,外层代表整个数据集的遍历次数,内层使用小批量数据读取进行梯度下降算法。
- 3、模型的测试
- 注:测试的时候,需要编辑model.eval()
import torch
import torch.nn as nn
# 定义模型结构
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 2)
self.dropout = nn.Dropout(0.5)
self.batch_norm = nn.BatchNorm1d(2)
def forward(self, x):
x = self.fc(x)
x = self.dropout(x)
x = self.batch_norm(x)
return x
# 初始化模型
model = SimpleModel()
# 加载训练好的模型权重
model.load_state_dict(torch.load('model.pth'))
# 将模型设置为评估模式
model.eval()
# 测试数据
test_input = torch.randn(5, 10)
# 禁用梯度计算
with torch.no_grad():
output = model(test_input)
print(output)
Q1:为什么训练集要分批次训练,跟每条数据单独训练(batch_size=1)有什么不一样的吗?
- 较大的 batch_size,梯度更新会更加平滑和稳定,模型能够更好地学到数据的总体分布特征。
- 最优的batch size跟训练集的大小有关,大数据集适合大batch,小数据集适合小batch,极端情况下batch_size=1也不是不可以。
Q2:为什么loss会不断变小?
- 梯度下降只包含了局部的损失函数信息,所以只能保证存在趋近局部最优的可能。
Loss 在训练过程中不断变小是因为优化算法(如梯度下降)的作用,但这个现象背后有多个原因和理论支持。逐步解析:
1. 梯度下降原理
梯度下降算法的核心思想是利用目标函数(即损失函数)的梯度来迭代地更新模型的参数。梯度本身指示了损失函数增长最快的方向,因此,通过向梯度的反方向更新参数,可以逐步减小损失值。
2. 局部最优与全局最优
- 局部最优:在多维空间中,损失函数可能存在多个局部最小值。梯度下降算法只能保证找到其中一个局部最小值,而不一定是全局最小值。
- 全局最优:对于凸函数,任何局部最小值也是全局最小值。但对于非凸函数(大多数深度学习模型的损失函数),找到全局最小值更加复杂。
3. 损失函数的性质
- 凸性:如果损失函数是凸的,那么任何局部最小值也是全局最小值,梯度下降法最终能够找到这个全局最小值。
- 非凸性:对于非凸函数,虽然存在多个局部最小值,但梯度下降法依然可以找到某个局部最小值,使得损失函数值减小。
4. 学习率的作用
- 学习率是梯度下降中一个关键的超参数,它决定了每一步参数更新的幅度。适当选择学习率可以保证算法的收敛性和稳定性。
5. 损失函数的优化目标
- 训练过程中,优化的目标是最小化损失函数,这通常意味着模型的预测误差在减少。
- 随着训练的进行,模型逐渐学习到数据中的模式和结构,使得预测更加准确,从而损失值减小。
6. 泛化能力
- 虽然训练过程中损失持续减小,但最终目标是提高模型在未知数据上的泛化能力。
- 为了防止过拟合,通常会采取正则化技术(如L1、L2正则化,Dropout等),以及早停(early stopping)策略。
7. 局部信息与全局搜索
- 梯度下降利用的是局部信息(即当前位置的梯度),它提供了一种贪婪的搜索策略,每一步都朝着减少损失的方向前进。
- 尽管只能保证趋近局部最优,但在实际应用中,通过合理的初始化、学习率调度和正则化策略,梯度下降往往能找到使损失足够小的参数配置。
结论
损失函数不断变小是因为梯度下降算法通过利用局部梯度信息来不断更新模型参数,使得模型逐渐学习到数据的内在规律,从而减少预测误差。虽然梯度下降只能保证找到局部最优解,但通过适当的策略和技巧,通常可以训练出性能良好的模型。