谱归一化(SNGAN)实现

SNGAN只要求了对鉴别器的参数做谱归一化,对生成器没有要求,对损失函数没有要求(SNGAN论文中使用的是原始GAN的损失函数),对优化器也没要求(SNGAN论文中既使用了Adam也使用了SGD).

下面说下对鉴别器使用谱归一化的pytorch实现()

def add_sn(model):
    """谱归一化,传入模型实例即可"""
    for name, layer in model.named_children():
        model.add_module(name, add_sn(layer))
        if isinstance(model, (nn.Conv2d, nn.Linear)):
            return nn.utils.spectral_norm(model)
        else:
            return model
    return model
net = Model()#自定义的模型
net = add_sn(net)

下面是这个方法(网上查到的版本,坑死我了)的错误版本和异常.

第一个是这种和它的异常.

def add_sn(model):
    """谱归一化,传入模型实例即可"""
    for name, layer in model.named_children():
        model.add_module(name, add_sn(layer))
        if isinstance(model, (nn.Conv2d, nn.Linear)):
            return nn.utils.spectral_norm(model)
        else:
            return model

'NoneType' object is not callable

出现第一个的原因是如果是叶子了,那么不会在for循环,没有返回值.

第二个是这种和它的异常.

def add_sn(model):
    """谱归一化,传入模型实例即可"""
    for name, layer in model.named_children():
        model.add_module(name, add_sn(layer))
    if isinstance(model, (nn.Conv2d, nn.Linear)):
        return nn.utils.spectral_norm(model)
    else:
        return model

RuntimeError: Cannot register two spectral_norm hooks on the same parameter weight

出现第二个的原因是最后的叶子卷积层谱归一化了两次.

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值