很简短的总结一下3种loss
1. LIPIS(Learned Perceptual Image Patch Similarity) Loss

基本上就是有很多层feature map 提取 然后每层都算loss
这3种其中 Squeeze-Net 模型最小
这里实现时候只get 两个模型[‘alex’, ‘vgg’]
记得用torch.compile(model(这里model为任何nn.module子类))加速
最后forward时做了一个判断
training时用vgg inference时用’alex’?
2. Pixelwise
从’MSE’ 和’L1’选
这里澄清一下之前说的
@staticmethod并不是和 @abstractmethod 对立才出现的
而是什么情况都可以用
代表该function不用接受self 和class 内部数据
因此不用create instance可以从class.func() 直接调用
注意这里和之前都用了 loss_fn().mean(dim=[1, 2, 3])
input, output dim为(N*M, C, H, W)
N * M = Batch * views
average across 3 dims
这里注意剩下两个dim时 需要拆开来分别mean 最后求整个bath mean
image_loss = self.loss_fn(x, y).mean(dim=[1, 2, 3])
batch_loss = image_loss.reshape(N, M).mean(dim=1)
all_loss = batch_loss.mean()
3. TVLoss
encourage相邻pix的值相近 生成更加natural的图像

先分别看 difference in nearby x, y value
diff_i = x[..., 1:, :] - x[..., :-1, :]
diff_j = x[..., :, 1:] - x[..., :, :-1]
分别对diff_i, j Count number of elements(除了 N*M)
def numel_excluding_first_dim(self, x):
return x.numel() // x.shape[0]
之后就是将sum squared diff/number of ele
最后将tv_i, j 相加 然后和之前一样算总mean