Java教程

23 损失函数与反向传播

本文主要是介绍23 损失函数与反向传播,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、损失函数

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

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

这篇关于23 损失函数与反向传播的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!