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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。