ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

23 损失函数与反向传播

2022-05-23 23:00:42  阅读:172  来源: 互联网

标签:loss 函数 nn 23 torch 反向 result import targets


一、损失函数

作用:衡量实际输出和真实想要的结果之间的差距,越小越好

image

1. L1Loss

计算方法:每个对应值相减的绝对值求和,再取平均
image

image

  • 案例
点击查看代码
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)

输出结果:
image

2. MSELoss

定义:均方误差 对应值相减 求平方 再求和 求平均

image

image

  • 案例
点击查看代码
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)

运行结果:

image

3. CrossEntropyLoss

交叉熵:用于分类问题

image

后面log部分,实际上就是以e为底,与exp部分就相消了,所以主要看小数部分,目的就是限制概率的分布,最好是预测的各个分类的概率都比较小,如果都比较大的话,那么就区分不出到底预测的是哪个类了。

image

N是batch_size,C是类别
image

  • 案例
点击查看代码
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)
  • 结果:
    image

用谷歌进行验算
image

二、案例:损失函数和反向传播

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

  • 断点位置
    image

  • 运行过程

根据步骤,可以看到我们计算出了对应grad,那么之后就可以根据这个进行反向传播,调节网络。
image

标签:loss,函数,nn,23,torch,反向,result,import,targets
来源: https://www.cnblogs.com/yuyingblogs/p/16303778.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有