一、损失函数
1.简要介绍
可参考博客:
损失函数(Loss Function)是用来衡量模型预测输出与实际标签之间的差异或误差程度的函数。在深度学习中,损失函数通常被设计为一个标量值,表示模型的预测值与真实标签之间的差异。
损失函数的选择对于训练深度学习模型非常重要,因为它直接影响着模型的训练效果和性能。在训练过程中,通过最小化损失函数来调整模型参数,使模型的预测结果逐渐接近真实标签,从而提高模型的准确性。
常见的损失函数:
均方误差(Mean Squared Error,MSE):用于回归任务,计算预测值与真实值之间的平方差的均值。
交叉熵损失函数(Cross Entropy Loss):用于分类任务,衡量模型输出的概率分布与真实标签的差异。
对数损失函数(Log Loss):也常用于二分类或多分类问题,衡量模型输出类别的概率与真实标签之间的关系。
Hinge损失函数:通常用于支持向量机(SVM)中,用于处理二分类问题。
Kullback-Leibler 散度(KL 散度):用于衡量两个概率分布之间的相似度。
2.代码
import torch
from torch import nn
# 定义输入张量和目标张量
inputs = torch.tensor([1, 2, 3], dtype=torch.float32)
targets = torch.tensor([1, 2, 5], dtype=torch.float32)
# 对输入和目标张量进行reshape操作以匹配损失函数的输入要求
inputs = torch.reshape(inputs, (1, 1, 1, 3))
targets = torch.reshape(targets, (1, 1, 1, 3))
# 实例化 L1 损失函数
loss = nn.L1Loss()
# 计算 L1 损失值
result = loss(inputs, targets)
print(result)
# 实例化均方误差(MSE)损失函数
loss_mse = nn.MSELoss()
# 计算均方误差损失值
result2 = loss_mse(inputs, targets)
print(result2)
代码运行结果:
二、优化器
1.简要介绍
优化器是深度学习中用于更新模型参数以最小化损失函数的算法。在神经网络训练过程中,通过计算损失函数对模型参数的梯度,优化器根据这些梯度来更新模型参数,使得损失函数逐渐减小,从而使模型更好地拟合训练数据。
2.代码
import torch.utils.data
import torchvision.datasets
from torch import nn
import torchvision
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
# 加载 CIFAR-10 数据集
datasets = torchvision.datasets.CIFAR10("./dataset1", train=False, transform=torchvision.transforms.ToTensor(), download=True)
# 创建数据加载器
dataloader = DataLoader(datasets, batch_size=1)
# 定义神经网络模型 Guodong
class Guodong(nn.Module):
def __init__(self):
super(Guodong, self).__init__()
self.module1 = Sequential(
Conv2d(3, 32, 5, padding=2), # 输入通道数为3,输出通道数为32,卷积核大小为5,填充为2
MaxPool2d(2), # 最大池化层,核大小为2
Conv2d(32, 32, 5, padding=2), # 输入通道数为32,输出通道数为32,卷积核大小为5,填充为2
MaxPool2d(2), # 最大池化层,核大小为2
Conv2d(32, 64, 5, padding=2), # 输入通道数为32,输出通道数为64,卷积核大小为5,填充为2
MaxPool2d(2), # 最大池化层,核大小为2
Flatten(), # 将多维输入展平为一维
Linear(1024, 64), # 全连接层,输入维度为1024,输出维度为64
Linear(64, 10) # 全连接层,输入维度为64,输出维度为10
)
def forward(self, input):
output = self.module1(input)
return output
# 实例化 Guodong 模型
guodong = Guodong()
# 定义交叉熵损失函数
loss = nn.CrossEntropyLoss()
optim = torch.optim.SGD(guodong.parameters(), lr=0.01)
for epoch in range(20):
loss_sum = 0.0
# 遍历数据加载器中的数据
for data in dataloader:
imgs, target = data
# 将图片输入模型得到预测输出
outputs = guodong(imgs)
# 计算交叉熵损失值
result_loss = loss(outputs, target)
optim.zero_grad()
# 反向传播计算梯度
result_loss.backward()
optim.step()
loss_sum += result_loss
print(loss_sum)
在
optim.zero_grad()
result_loss.backward()
optim.step()
这三处设置断点,调试,可以看到grad一开始是None,后来有了具体的数值
代码打印结果为:
(后面还没打印出来,程序运行有点慢QAQ)
可以看到最开始的时候loss_sum在变小,后来又变大。
在深度学习训练过程中,损失函数的值不一定是单调递减的,特别是在使用随机梯度下降(SGD)等基于随机采样的优化算法时。因此,损失函数值的变化可能会出现波动或不规则的情况。
sum_loss 的数值一开始是在减小的,但后来又增大了。这可能是由多种原因引起的,例如:
(1)训练数据的顺序:在每个 epoch 中,数据加载器可能以不同的顺序提供训练样本,这会导致模型参数的更新方向有所不同,从而影响损失函数的变化。
(2)学习率的设置:学习率控制着参数更新的步长大小,如果学习率设置得过大,可能会导致参数更新过程不稳定,损失函数值出现震荡或上升。
(3)模型复杂度和数据集的匹配程度:如果模型的复杂度过高,而训练数据集较小或难以拟合,模型可能会出现过拟合现象,导致损失函数值增大。