【GAN对抗性损失函数】以CycleGAN和PIX2PIX算法的对抗性损失的代码为例进行讲解

一、代码

python 复制代码
class GANLoss(nn.Module):
    """Define different GAN objectives.
    The GANLoss class abstracts away the need to create the target label tensor
    that has the same size as the input.
    """
    def __init__(self, gan_mode, target_real_label=1.0, target_fake_label=0.0):
        """ Initialize the GANLoss class.
        Parameters:
            gan_mode (str) - - the type of GAN objective. It currently supports vanilla, lsgan, and wgangp.
            target_real_label (bool) - - label for a real image
            target_fake_label (bool) - - label of a fake image
        Note: Do not use sigmoid as the last layer of Discriminator.
        LSGAN needs no sigmoid. vanilla GANs will handle it with BCEWithLogitsLoss.
        """
        super(GANLoss, self).__init__()
        self.register_buffer('real_label', torch.tensor(target_real_label))
        self.register_buffer('fake_label', torch.tensor(target_fake_label))
        self.gan_mode = gan_mode
        if gan_mode == 'lsgan':
            self.loss = nn.MSELoss()
        elif gan_mode == 'RidgeRegressionaLoss':
            self.loss = RidgeLoss1(alpha=0.1)
        elif gan_mode == 'vanilla':
            self.loss = nn.BCEWithLogitsLoss()
        elif gan_mode in ['wgangp']:
            self.loss = None
        else:
            raise NotImplementedError('gan mode %s not implemented' % gan_mode)
    def get_target_tensor(self, prediction, target_is_real):
        """Create label tensors with the same size as the input.
        Parameters:
            prediction (tensor) - - tpyically the prediction from a discriminator
            target_is_real (bool) - - if the ground truth label is for real images or fake images
        Returns:
            A label tensor filled with ground truth label, and with the size of the input
        """
        if target_is_real:
            target_tensor = self.real_label
        else:
            target_tensor = self.fake_label
        return target_tensor.expand_as(prediction)

    def __call__(self, prediction, target_is_real):
        """Calculate loss given Discriminator's output and grount truth labels.

        Parameters:
            prediction (tensor) - - tpyically the prediction output from a discriminator
            target_is_real (bool) - - if the ground truth label is for real images or fake images

        Returns:
            the calculated loss.
        """
        if self.gan_mode in ['lsgan', 'vanilla','RidgeRegressionaLoss']:
            target_tensor = self.get_target_tensor(prediction, target_is_real)
            loss = self.loss(prediction, target_tensor)
        elif self.gan_mode == 'wgangp':
            if target_is_real:
                loss = -prediction.mean()
            else:
                loss = prediction.mean()
        return loss

二、讲解

target_tensor.expand_as(prediction)的意思是将target_tensor张量的尺寸扩展为与prediction张量相同的尺寸。

在生成对抗网络(GAN)中,判别器的输出通常是一个张量,表示样本为真实样本的概率或得分。为了计算损失,需要创建与判别器输出相同尺寸的目标标签张量。target_tensorget_target_tensor方法中获得,表示目标标签,可以是真实样本标签或虚假样本标签。为了与判别器的输出张量进行元素级别的比较,需要将目标标签张量的尺寸扩展为与判别器输出相同的形状。

expand_as(prediction)方法是一个张量的方法,它返回一个尺寸与prediction张量相同的新张量,其中新张量的元素以target_tensor的元素进行填充或重复,以便与prediction进行逐元素比较。

通过将目标标签张量的尺寸扩展为与判别器输出相同的尺寸,可以确保在计算损失时每个生成样本或真实样本的标签都与对应的判别器输出进行比较。

相关推荐
一只懒洋洋7 分钟前
中值滤波、方框滤波、高斯滤波、均值滤波、膨胀、腐蚀、开运算、闭运算
算法·均值算法
shellvon14 分钟前
你怎么被识别的?从TLS到Canvas的设备追踪术
后端·算法
薛定谔的算法20 分钟前
JavaScript栈的实现与应用:从基础到实战
前端·javascript·算法
羚羊角uou26 分钟前
【Linux】匿名管道和进程池
linux·c++·算法
GEO科技权威资讯33 分钟前
生成对抗网络 (GAN):理解其原理与创作能力
人工智能·神经网络·生成对抗网络
空白到白1 小时前
决策树-面试题
算法·决策树·机器学习
flashlight_hi1 小时前
LeetCode 分类刷题:2563. 统计公平数对的数目
python·算法·leetcode
西猫雷婶2 小时前
scikit-learn/sklearn学习|广义线性回归损失函数的基本表达式
深度学习·神经网络·学习·机器学习·线性回归·scikit-learn·概率论
前端世界2 小时前
HarmonyOS 数据处理性能优化:算法 + 异步 + 分布式实战
算法·性能优化·harmonyos
楼田莉子2 小时前
C++算法专题学习:栈相关的算法
开发语言·c++·算法·leetcode