天天看点

Pytorch损失函数

学习过程知识粗略记录,用于个人理解和日后查看

包导入

import torch
from torch import nn
           

MSELoss-均方差损失

  • 常用于回归问题中
  • 对于每一个输入实例都只有一个输出值,把所有输入实例的预测值和真实值见的误差求平方,然后取平均
  • 定义:

    class torch.nn.MSELoss(size_average=True,reduce=True)

参数含义
  • size_average

    :默认为

    True

    ,此时损失为每个

    minibatch

    的平均;

    False

    时,损失为每个

    minibatch

    的求和。这个属性只有在

    reduce

    设置为True时才生效
  • reduce

    True

    ,损失根据

    size_average

    的值计算;

    False

    时,忽略

    size_average

    值,返回每个元素的损失
loss=nn.MSELoss()
input = torch.randn(2, 3, requires_grad=True)
target = torch.randn(2,3)
print(input)
print(target)
output = loss(input, target)
output.backward()
print(output)
           
Pytorch损失函数

L1Loss-MAE平均绝对误差

  • 返回数据集上所有误差绝对值的平均数
  • class torch.nn.L1Loss(size_average=True,reduce=True)

    ,参数与

    MSE

    相同
loss=nn.L1Loss()
input = torch.randn(2, 3, requires_grad=True)
target = torch.randn(2,3)
print(input)
print(target)
output = loss(input, target)
output.backward()
print(output)
           
Pytorch损失函数

BCELoss

  • 常用于二分类问题中
  • class torch.nn.BCELoss(weight=None, size_average=True, reduce=True)

参数定义:
  • weight

    :指定

    batch

    中的每个元素的

    Loss

    权重,必须是一个长度和

    batch

    相等的

    Tensor

  • 值得注意的是,每个目标值都要求在

    (0,1)

    之间,可以在网络最后一层加一个

    Sigmoid

    解决这个问题
m = nn.Sigmoid()
loss = nn.BCELoss()
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
print(input)
print(target)
output = loss(m(input), target)
output.backward()
print(output)
           
Pytorch损失函数

BCEWithLogitsLoss

  • 同样用于二分类问题,他将

    Sigmoid

    集合在了函数中,因而实际使用中会比

    BCELoss

    在数值上更加稳定
  • class torch.nn.BCEWithLogitsLoss(weight=None, size_average=True, reduce=True)

    ,参数同

    BCELoss

    一致
loss = nn.BCEWithLogitsLoss()
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
print(input)
print(target)
output = loss(input, target)
output.backward()
print(output)
           
Pytorch损失函数

NLLLoss-负对数似然损失函数

  • 应用于多分类任务中,用C表示多分类任务中的类别个数,

    N

    表示

    minibatch

    ,则

    NLLLoss

    的输入必须是

    (N,C)

    的二维

    Tensor

    ,也就是每个实例对应的每个类别的对数概率,可以在网络的最后一层加

    LogSoftmax

    层来实现
  • 定义:

    class torch.nn.NLLLoss(weight=None, size_average=True, ignore_index=-100,reduce=True)

参数含义:
  • weight

    :指定一个一维的

    Tensor

    ,用来设置每个类别的权重(非必须项)
  • ignore_index

    :设置一个被忽略值,使这个值不会影响到输入的梯度计算,

    size_average

    True

    时,

    loss

    的平均值也会忽略该值
  • 值得注意的时,输入根据

    reduce

    而定,

    True

    则输出一个标量,

    False

    则输出

    N

m = nn.LogSoftmax(dim=1)
loss = nn.NLLLoss()
# input is of size N x C = 3 x 5
input = torch.randn(3, 5, requires_grad=True)
# each element in target has to have 0 <= value < C
target = torch.tensor([1, 0, 4])
print(input)
print(target)
output = loss(m(input), target)
output.backward()
print(output)
           
Pytorch损失函数

CrossEntropyLoss-交叉熵损失

  • 用于多分类问题,

    LogSoftmax

    NLLLoss

    的组合
  • class torch.nn.CrossEntropyLoss(weight=None, size_average=True, ignore_index=-100,reduce=True)

    ,参数含义与

    NLLLoss

loss = nn.CrossEntropyLoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.empty(3, dtype=torch.long).random_(5)
print(input)
print(target)
output = loss(input, target)
output.backward()
print(output)
           
Pytorch损失函数

如有错误,欢迎指正

同时发布在CSDN中:https://blog.csdn.net/tangkcc/article/details/119803598

继续阅读