#eps28

#API 是 Application Programming Interface(应用程序编程接口)的缩写。

#API 就是别人写好的“函数/类的使用说明书”

主要思路:

先是把predict和target拆分成为不同部分,

再是对各个部分应用不同的损失函数

最后是把所有损失相加

一、介绍dataset和data loader

数据集与数据加载器——PyTorch 教程 2.13.0+cu130 文档 --- Datasets & DataLoaders — PyTorch Tutorials 2.13.0+cu130 documentation

 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=Nonereduce=Nonereduction='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=Nonesize_average=Noneignore_index=-100reduce=Nonereduction='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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐