一、L1Loss(绝对值误差损失)、MSELoss(平方误差损失):用于回归问题
参数reduction:
-
'mean'(默认)
:返回损失的平均值(相当于size_average=True
)。 -
'sum'
:返回损失的总和(相当于reduce=False
)。
import torch
from torch.nn import L1Loss, MSELoss
input=torch.tensor([1,2,3],dtype=float)
target=torch.tensor([1,2,5],dtype=float)
loss=L1Loss(reduction='sum') #L1Loss: 绝对值误差损失,返回损失的总和
result=loss(input,target)
print(result) #tensor(2., dtype=torch.float64)
lose_mse=MSELoss() #MSELoss: 平方误差损失,不设置则默认返回损失的平均值
result_mse=lose_mse(input,target)
print(result_mse) #tensor(1.3333, dtype=torch.float64)
二、交叉熵损失:用于分类问题
1、如何计算:
2、如何使用:
#交叉熵:常用于分类问题的损失函数
import torch
from torch import nn
x=torch.tensor([[0.1,0.2,0.3]]) #torch.Size([3])
y=torch.tensor([1])
#如果x是x=torch.tensor([0.1,0.2,0.3])的话,要写x=torch.reshape(x,(1,3)) #torch.Size([1, 3])
#对应的关系:
#x=[ 有三个样本时
# []
# []
# []
# ]
#y=[a1,a2,a3]
loss=nn.CrossEntropyLoss()
result_cross=loss(x,y)
print(result_cross)
3、举例:CIFAR10的分类损失
每次抓取一张图片:
img——>模型——>output(十个分类的得分)
cross_entropy_loss(output,target)
import torch
import torchvision.datasets
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
#以CIFAR10的分类检测为例,计算模型的loss
test_set=torchvision.datasets.CIFAR10(root="./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader=DataLoader(test_set,batch_size=1)
class Xigua(nn.Module):
def __init__(self):
super().__init__()
self.model1=Sequential(
Conv2d(3,32,5,padding=2),
MaxPool2d(2),
Conv2d(32,32,5,padding=2),
MaxPool2d(2),
Conv2d(32,64,5,padding=2),
MaxPool2d(2),
Flatten(),
Linear(1024,64),
Linear(64,10),
)
def forward(self,x):
x=self.model1(x)
return x
xigua1=Xigua()
loss=nn.CrossEntropyLoss()
step=0
for data in dataloader:
imgs,targets=data
outputs=xigua1(imgs)
#看下outputs和targets长什么样,进而选择什么样的损失函数
print(outputs)
print(targets)
result_loss=loss(outputs,targets)
print(result_loss)
step+=1
if step>=1:
break