书接上回(实现第一个目标检测损失函数)
#eps28
#API 是 Application Programming Interface(应用程序编程接口)的缩写。
#API 就是别人写好的“函数/类的使用说明书”。
主要思路:
先是把predict和target拆分成为不同部分,
再是对各个部分应用不同的损失函数
最后是把所有损失相加
一、介绍dataset和data loader
dataset就是告诉你怎么取数据
data loader是告诉你怎么组织这个数据


回顾


引入一个batch相关知识
batch就是一个批次处理多少张图片
然后batch=N则输出就是N*8
如下图
如何计算batch的损失值呢
就是例如图一的predict和target计算得到Loss1,图二的predict和target计算得到Loss2
然后batch的loss就是求和或者求平均

引入batch作用
就是写loss函数的时候,以一个batch为一个单位
#predicts的尺寸为【N,8】,也就是N行8列大小,其中N取决于送入网络模型的图片数量
记住!forward函数里边的predicts和targets第一个参数都是batch

代码
from torch import nn
class TuduiLoss(nn.Module):
def __init__(self):
super().__init__()
self.location=nn.MSELoss()
self.class_loss=nn.CrossEntropyLoss()
#predicts的尺寸为【N,8】,也就是N行8列大小,其中N取决于送入网络模型的图片数量
def forward(self,predicts,targets):#因为模型必须接触模型预测出来的结果predicts+真实答案targets这两个输入
二、pytorch里边取数据的知识点补充

data[行信息,列信息]
比如下面的scratch临时测试文件代码
随机一个六行八列的数字torch.rand(6,8)
import torch
if __name__ == '__main__':
data=torch.rand(6,8)
print(data)
data_two_column=data[:,0:2]
print(data_two_column)
data_box=data[:3,0:2]
print(data_box)
运行后输出如下

三、整体一个loss代码
MSELoss具体计算官网
MSELoss — PyTorch 2.13 文档 - PyTorch 文档
class torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')[源码]
注意参数reduction
reduction默认是default=“mean”
另一个是reduction=“sum”
官方示例
(1)把nn.MSELoss()赋值给一个变量(假如为loss)
(2)然后输出结果就是loss(predicts,targets)
此示例中的input就是预测,target就是真实结果

MSE具体计算方法如下:
这个MSE的sum有点特殊(没有除以) ,一般其他的sum都不是这样,所以可以不管这个

写一个scratch临时文件loss_test
import torch
from torch import nn
if __name__ == '__main__':
predicts=torch.tensor([
[0.4,0.3,0.2,0.1,9.0,-1.4,0.3,0.2],
[0.3,0.2,0.1,0.5,1.0,0.3,1.0,0.4]
])
predicts_locations=predicts[:,0:4]
predicts_classes=predicts[:,4:8]
print(predicts.size())
print(predicts_locations)
print(predicts_classes)
targets=torch.tensor([
[0.3,0.2,0.1,0.2,1.0,0.0,0.0,0.0],
[0.4,0.2,0.1,0.2,0.0,1.0,0.0,0.0]
])
targets_locations = targets[:, 0:4]
targets_classes = targets[:, 4:8]
print(targets_locations)
print(targets_classes)
#接下来是MSELoss
location_loss=nn.MSELoss()
batchloss1=location_loss(predicts_locations,targets_locations)
print(batchloss1)
交叉熵具体计算官网
回顾交叉熵的处理
分两步,先softmax再crossentropy
但是这个pytorch官网的api已经把两者集成在一起了
class torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean', label_smoothing=0.0)[source]
然后reduction也是默认是“mean”



具体计算
其中softmax calculator有在线计算的
Softmax Calculator - NN Output Activation | NicheCalcs

关于target_classes其实可以换一种写法就是one hot编码

最终整体代码
from torch import nn
class TuduiLoss(nn.Module):
def __init__(self):
super().__init__()
self.location_loss=nn.MSELoss()
self.class_loss=nn.CrossEntropyLoss()
#predicts的尺寸为【N,8】,也就是N行8列大小,其中N取决于送入网络模型的图片数量
# 因为模型必须接触模型预测出来的结果predicts+真实答案targets这两个输入
def forward(self,predicts,targets):
predicts_locations=predicts[:,0:4]
predicts_classes=predicts[:,4:8]
targets_locations=targets[:,0:4]
targets_classes=targets[:,4:8]
location_loss_value= self.location_loss(predicts_locations,targets_locations)
class_loss_value=self.class_lossA(predicts_classes,targets_classes)
return location_loss_value+class_loss_value
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)