#view
import torch
x = torch.tensor([1, 2, 3, 4])
y = x.view(2, 2)
# y 的形状将是 torch.Size([2, 2])
# permute
x = torch.randn(2, 3)
y = x.permute(1, 0)
# y 的形状将是 torch.Size([3, 2])
#matmul
A = torch.tensor([[1, 2], [3, 4]])
B = torch.tensor([[5, 6], [7, 8]])
C = torch.matmul(A, B)
# C 将是 torch.tensor([[19, 22], [43, 50]])
#__call__
在 Python 类中,
__call__
方法是一个特殊的方法,它允许一个类的实例表现得像一个函数一样,可以被调用。当你在一个对象上使用圆括号()
时,__call__
方法被触发。在 PyTorch 中,
__call__
方法通常用于自定义损失函数(criterion)或模型。对于损失函数,__call__
方法定义了如何根据模型的预测(predictions)和真实标签(targets)计算损失值。
计算损失: 根据传入的模型预测
preds
和批次数据batch
,计算分类(cls)、边界框(box)和分布场(dfl)的损失。损失组合: 将不同的损失部分(box, cls, dfl)相加并乘以批次大小,得到总损失。
返回值: 返回总损失和解耦的损失值,这允许在训练过程中同时优化多个损失组件。
具体步骤包括:
- 使用
preprocess
方法预处理目标数据。- 通过
bbox_decode
方法解码预测的边界框。- 使用自定义的分配器(
self.assigner
)分配真实标签和边界框到预测上。- 计算分类损失和边界框损失。
- 将损失值乘以超参数(如
self.hyp.box
,self.hyp.cls
,self.hyp.dfl
)以控制不同损失部分的贡献。- 返回总损失和解耦的损失值。