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
出现第二个的原因是最后的叶子卷积层谱归一化了两次.