损失函数
1、计算实际输出和目标之间的差距 2、为更新输出提供一定的依据(反向传播),调优的参数是卷积核当中的参数 ,为卷积核当中的参数设置了梯度grad。将整个loss降低。L1Loss
相减后的绝对值,要么取平均,要么求和。
参数:reducion可选择sum、mean等。
L1Loss(reduction=‘sum’)
X=1,2,3
Y=1,2,5
L1loss=(0+0+1)/3=0.6
MSELOSS
平方差
交叉熵CROSSENTROPYLOSS
用于分类问题
参数:
Input:分的类别
Target:目标
import torch
from torch.nn import L1Loss
from torch.nn import MSELoss,CrossEntropyLoss
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='sum')
result=loss(inputs,targets)
loss_mse=MSELoss()
result_mse=loss_mse(inputs,targets)
print('L1loss:{}'.format(result))
print('mse:{}'.format(result_mse))
#三分类问题
x=torch.tensor([0.1,0.2,0.3]) #分成第一类的概率是0.1 分成第二类的概率是0.2 分成第三类的概率是0.3
print('x:{}'.format(x))
y=torch.tensor([1])
x=torch.reshape(x,(1,3)) #1是batch_size 3是class
loss_cross=CrossEntropyLoss()
result_cross=loss_cross(x,y)
print('CrossEntropyLoss:{}'.format(result_cross))
结果:
反向传播
反向传播是为了将损失函数(目标函数)变小。
反向传播backward
前向传播forward
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
dataset=torchvision.datasets.CIFAR10("dataset_CIFAR10",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader=DataLoader(dataset,batch_size=1)
class Demo(nn.Module):
def __init__(self) -> None:
super().__init__()
self.model1=Sequential(
Conv2d(in_channels=3, out_channels=32, kernel_size=5, stride=1, padding=2, dilation=1, ),
MaxPool2d(kernel_size=2, ),
Conv2d(in_channels=32, out_channels=32, kernel_size=5, stride=1, padding=2, ),
MaxPool2d(kernel_size=2),
Conv2d(32, 64, 5, 1, 2),
MaxPool2d(2),
Flatten(),
Linear(1024, 64),
Linear(64, 10),
)
def forward(self,x):
x=self.model1(x)
return x
loss=nn.CrossEntropyLoss()
demo=Demo()
for data in dataloader:
imgs,targets=data
#送入网络进行训练
outputs=demo(imgs)
#输出的结果是10分类
#print(outputs)
#输出真实的标签
#print(targets)
'''损失函数'''
result_loss=loss(outputs,targets)
#反向传播,算出梯度(梯度下降法),求出最小的loss
result_loss.backward()
print(result_loss)
反向传播后才会有grag参数。