Pytorch 神经网络训练代码,pytorch BN

  Pytorch 神经网络训练代码,pytorch BN

  本文主要介绍了python神经网络pytorch中BN运算的自实现实例。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  BN想必大家都很熟悉,来自论文:

  《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》

  也是面试经常考察的内容。虽然一行代码就可以完成,但还是要自己实现,也要加深对其内部机制的理解。

  

通用公式:

  

直奔代码:

  首先,定义一个函数来实现BN的操作:

  def batch_norm(is_training,x,gamma,beta,moving_mean,moving_var,eps=1e-5,momentum=0.9):

  #确定当前模式是训练模式还是预测模式。

  如果不是is_training:

  #如果是预测模式,直接用来话移动平均的均值和方差。

  x_hat=(x -移动_均值)/torch.sqrt(移动_var eps)

  else:

  如果len(x.shape)==2:

  #使用全连接层的情况计算特征尺寸的平均值和方差。

  mean=x.mean(dim=0)

  var=((x均值)** 2)。平均值(dim=0)

  else:

  #在使用二维卷积层的情况下,计算通道维度(轴=1)的平均值和方差。这里我们需要保持

  # x形状,以便以后可以进行广播操作。

  mean=x.mean(dim=0,keepdim=True)。均值(dim=2,keepdim=True)。平均值(dim=3,keepdim=True)

  var=((x均值)** 2)。均值(dim=0,keepdim=True)。均值(dim=2,keepdim=True)。平均值(dim=3,keepdim=True)

  #用训练模式中的当前均值和方差进行标准化

  x _ hat=(x-mean)/torch . sqrt(var EPS)

  #更新移动平均值的平均值和方差

  移动平均值=动量*移动平均值(1.0 -动量)*平均值

  moving _ var=momentum * moving _ var(1.0-momentum)* var

  X=gamma * x _ hat拉伸和偏移

  返回Y,移动平均值,移动变量

  然后定义一个类,就是集成nn的常用类。组件

  这里有三点:

  BN在卷积上的实现是在Batch,w,h上归一化的,也就是把BWH画成一个维度来求均值和方差,均值和方差的维度,和是信道。当然,其他的N,包括in,LN和GN,都包含WH维度。不需要计算梯度和梯度更新涉及的参数,直接用self.register_buffer注册即可;也使用注册变量;包装为nn的参数。参数需要梯度,但不能添加cuda(),否则会报错。如果想在gpu上操作,可以添加。cuda()到整个类实例。例如bn=BatchNorm(**param),bn=bn.cuda()。classbatchnorm (nn.module) 3360

  def __init__(自身,特征数量,尺寸数量):

  超级(BatchNorm,self)。__init__()

  If _ dims==2: #也用于判断是全连通层还是卷积层。

  shape=(1,数量_特征)

  else:

  shape=(1,数量_特征,1,1)

  #梯度和迭代中涉及的拉伸和偏移参数分别初始化为0和1。

  self=nn。参数(torch.ones(shape))

  self=nn。参数(火炬.零(形状))

  #不参与梯度和迭代的变量全部初始化为0。

  self . register _ buffer( moving _ mean ,torch.zeros(shape))

  self . register _ buffer( moving _ var ,torch.ones(shape))

  定义向前(自身,x):

  #如果X不在内存中,将moving_mean和moving_var复制到X所在的内存中。

  if self.moving_mean.device!=x.device:

  self . moving _ mean=self . moving _ mean . to(x . device)

  self . moving _ var=self . moving _ var . to(x . device)

  #保存更新后的移动平均值和移动变化值。默认情况下,模块实例的traning属性为true,调用后设置为false。eval()

  y,self.moving _ mean,self . moveing _ var=batch _ norm(self . training,

  x,自,自,自移动均值,

  self.moving_var,eps=1e-5,momentum=0.9)

  返回x

  以上是python神经网络pytorch中BN运算自实现的详细内容。更多pytorch BN运营信息,请关注盛行IT软件开发工作室其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: