text: # !/usr/bin/env python
  # -- coding: utf-8 --
  # @Author zengxiaohui
  # Datatime:6/22/2021 12:51 PM
  # @File:init_weight
  import math
  
  import torch
  from torch import nn
  
  
  def _init_weight(self):
      for m in self.modules():
          if isinstance(m, nn.Conv2d):
              n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
              m.weight.data.normal_(0, math.sqrt(2. / n))
          elif isinstance(m, nn.BatchNorm2d):
              m.weight.data.fill_(1)
              m.bias.data.zero_()
  
  #---------------------------------------#
  def initialize_weights(*models):
      for model in models:
          real_init_weights(model)
  
  
  def real_init_weights(m):
      if isinstance(m, list):
          for mini_m in m:
              real_init_weights(mini_m)
      else:
          if isinstance(m, torch.nn.Conv2d):
              torch.nn.init.kaiming_normal_(m.weight, nonlinearity='relu')
              if m.bias is not None:
                  torch.nn.init.constant_(m.bias, 0)
          elif isinstance(m, torch.nn.Linear):
              m.weight.data.normal_(0.0, std=0.01)
          elif isinstance(m, torch.nn.BatchNorm2d):
              torch.nn.init.constant_(m.weight, 1)
              torch.nn.init.constant_(m.bias, 0)
          elif isinstance(m, torch.nn.Module):
              for mini_m in m.children():
                  real_init_weights(mini_m)
          else:
              print('unkonwn module', m)