作用:衡量实际输出和真实想要的结果之间的差距,越小越好
计算方法:每个对应值相减的绝对值求和,再取平均
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)
输出结果:
定义:均方误差 对应值相减 求平方 再求和 求平均
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)
运行结果:
交叉熵:用于分类问题
后面log部分,实际上就是以e为底,与exp部分就相消了,所以主要看小数部分,目的就是限制概率的分布,最好是预测的各个分类的概率都比较小,如果都比较大的话,那么就区分不出到底预测的是哪个类了。
N是batch_size,C是类别
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)
用谷歌进行验算
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)
断点位置
运行过程
根据步骤,可以看到我们计算出了对应grad,那么之后就可以根据这个进行反向传播,调节网络。