针对于不同层类型定制化初始化
举个栗子:
def weights_init(m): ##定义参数初始化函数
classname = m.__class__.__name__ # m作为一个形参,原则上可以传递很多的内容,为了实现多实参传递,每一个moudle要给出自己的name. 所以这句话就是返回m的名字。具体例子下边会详细说明。
if classname.find('Conv') != -1:#find()函数,实现查找classname中是否含有conv字符,没有返回-1;有返回0.
nn.init.normal_(m.weight.data, 0.0, 0.02)#m.weight.data表示需要初始化的权重。 nn.init.normal_()表示随机初始化采用正态分布,均值为0,标准差为0.02.
elif classname.find('BatchNorm') != -1:
nn.init.normal_(m.weight.data, 1.0, 0.02)
nn.init.constant_(m.bias.data, 0) # nn.init.constant_()表示将偏差定义为常量0
netG.apply(weights_init)#netG是我们给写的神经网络定义的类实例。
apply函数会递归地搜索网络内的所有module并把参数表示的函数应用到所有的module上。也就是说apply函数,会一层一层的去拜访Generator网络层。