23 损失函数与反向传播
2022/5/23 23:49:59
本文主要是介绍23 损失函数与反向传播,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、损失函数
作用:衡量实际输出和真实想要的结果之间的差距,越小越好
1. L1Loss
计算方法:每个对应值相减的绝对值求和,再取平均
- 案例
点击查看代码
import torch from torch.nn import L1Loss # 输入 inputs=torch.tensor([1,2,3],dtype=torch.float32) targets=torch.tensor([1,2,5],dtype=torch.float32) # 转变输入形状 inputs=torch.reshape(inputs,(1,1,1,3)) targets=torch.reshape(targets,(1,1,1,3)) #计算损失 loss=L1Loss(reduction='mean') #可以选sum result=loss(inputs,targets) #输出结果 print(result)
输出结果:
2. MSELoss
定义:均方误差 对应值相减 求平方 再求和 求平均
- 案例
点击查看代码
import torch from torch import nn from torch.nn import L1Loss # 输入 inputs=torch.tensor([1,2,3],dtype=torch.float32) targets=torch.tensor([1,2,5],dtype=torch.float32) # 转变输入形状 inputs=torch.reshape(inputs,(1,1,1,3)) targets=torch.reshape(targets,(1,1,1,3)) #计算损失 # loss=L1Loss(reduction='mean') #可以选sum # result=loss(inputs,targets) loss_mse=nn.MSELoss() result_mse=loss_mse(inputs,targets) #输出结果 # print(result) print(result_mse)
运行结果:
3. CrossEntropyLoss
交叉熵:用于分类问题
后面log部分,实际上就是以e为底,与exp部分就相消了,所以主要看小数部分,目的就是限制概率的分布,最好是预测的各个分类的概率都比较小,如果都比较大的话,那么就区分不出到底预测的是哪个类了。
N是batch_size,C是类别
- 案例
点击查看代码
import torch from torch import nn ## 交叉熵 #每个类别对应的概率 x=torch.tensor([0.1,0.2,0.3]) #目标类别 y=torch.tensor([1]) #改变输入的形式 x=torch.reshape(x,(1,3)) #计算loss loss_cross=nn.CrossEntropyLoss() result_cross=loss_cross(x,y) #输出 print(result_cross)
- 结果:
用谷歌进行验算
二、案例:损失函数和反向传播
1. 代码
点击查看代码
import torch import torchvision from torch import nn from torch.nn import Conv2d,MaxPool2d,Flatten,Linear,Sequential from torch.utils.tensorboard import SummaryWriter # 测试集 from torch.utils.data import DataLoader test_data=torchvision.datasets.CIFAR10(root="./CIFAR10_dataset",transform=torchvision.transforms.ToTensor(),train=False,download=True) test_loader=DataLoader(dataset=test_data,batch_size=1) # 定义网络结构 class Tudui(nn.Module): def __init__(self): super(Tudui, self).__init__() # self.conv1=Conv2d(3,32,5,padding=2) #可以每一层都用这种方式定义,下面再用这种方式调用 self.model1=Sequential( #使用sequential Conv2d(3,32,5,padding=2), #in_channel 3;out_channel 32;kernel 5;padding需要计算(一般不会太大) MaxPool2d(2), #kennel_Size=2 Conv2d(32,32,5,padding=2), MaxPool2d(2), Conv2d(32,64,5,padding=2), MaxPool2d(2), Flatten(), #展平 :可以把后面的删掉 获得输出的大小 Linear(1024,64),#看上一层的大小 ,可以看到是1024 Linear(64,10) #输入大小 64 输出大小 10 ) def forward(self,x): x=self.model1(x) return x # 声明网络 tudui=Tudui() #定义loss loss=nn.CrossEntropyLoss() for data in test_loader: imgs,targets=data outputs=tudui(imgs) result_loss=loss(outputs,targets) # 计算梯度 反向传播:注意反向传播的对象 下一步就是利用优化器来优化 result_loss.backward() print("ok") ##损失的结果 # print(result_loss) # print(outputs) # print(targets)
2.debug
-
断点位置
-
运行过程
根据步骤,可以看到我们计算出了对应grad,那么之后就可以根据这个进行反向传播,调节网络。
这篇关于23 损失函数与反向传播的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)