b站小土堆pytorch学习记录—— P23-P24 损失函数、反向传播和优化器

2024-03-08 07:52

本文主要是介绍b站小土堆pytorch学习记录—— P23-P24 损失函数、反向传播和优化器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、损失函数
    • 1.简要介绍
    • 2.代码
  • 二、优化器
    • 1.简要介绍
    • 2.代码

一、损失函数

1.简要介绍

可参考博客:

常见的损失函数总结

损失函数的全面介绍

pytorch学习之十九种损失函数

损失函数(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,填充为2MaxPool2d(2),  # 最大池化层,核大小为2Conv2d(32, 32, 5, padding=2),  # 输入通道数为32,输出通道数为32,卷积核大小为5,填充为2MaxPool2d(2),  # 最大池化层,核大小为2Conv2d(32, 64, 5, padding=2),  # 输入通道数为32,输出通道数为64,卷积核大小为5,填充为2MaxPool2d(2),  # 最大池化层,核大小为2Flatten(),  # 将多维输入展平为一维Linear(1024, 64),  # 全连接层,输入维度为1024,输出维度为64Linear(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_lossprint(loss_sum)


optim.zero_grad()
result_loss.backward()
optim.step()
这三处设置断点,调试,可以看到grad一开始是None,后来有了具体的数值

在这里插入图片描述
在这里插入图片描述
代码打印结果为:

在这里插入图片描述
(后面还没打印出来,程序运行有点慢QAQ)

可以看到最开始的时候loss_sum在变小,后来又变大。

在深度学习训练过程中,损失函数的值不一定是单调递减的,特别是在使用随机梯度下降(SGD)等基于随机采样的优化算法时。因此,损失函数值的变化可能会出现波动或不规则的情况。

sum_loss 的数值一开始是在减小的,但后来又增大了。这可能是由多种原因引起的,例如:

(1)训练数据的顺序:在每个 epoch 中,数据加载器可能以不同的顺序提供训练样本,这会导致模型参数的更新方向有所不同,从而影响损失函数的变化。

(2)学习率的设置:学习率控制着参数更新的步长大小,如果学习率设置得过大,可能会导致参数更新过程不稳定,损失函数值出现震荡或上升。

(3)模型复杂度和数据集的匹配程度:如果模型的复杂度过高,而训练数据集较小或难以拟合,模型可能会出现过拟合现象,导致损失函数值增大。

这篇关于b站小土堆pytorch学习记录—— P23-P24 损失函数、反向传播和优化器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786489

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份