python pytorch教程_pytorch之添加BN的实现

本文介绍了批标准化(BN)在深度学习中的作用,用于加速模型训练和改善收敛。通过批标准化,每个网络层的输出被调整为标准正态分布,从而简化后续层的训练。文章提供了BN的理论背景、一维和二维的实现示例,以及在卷积网络中的应用,并通过MNIST数据集的实验对比了使用和不使用BN的效果。
摘要由CSDN通过智能技术生成

更多python教程请到: 菜鸟教程www.piaodoo.com

人人影视www.sfkyty.com

16影视www.591319.com

星辰影院www.591319.com

pytorch之添加BN层

批标准化

模型训练并不容易,特别是一些非常复杂的模型,并不能非常好的训练得到收敛的结果,所以对数据增加一些预处理,同时使用批标准化能够得到非常好的收敛结果,这也是卷积网络能够训练到非常深的层的一个重要原因。

数据预处理

目前数据预处理最常见的方法就是中心化和标准化,中心化相当于修正数据的中心位置,实现方法非常简单,就是在每个特征维度上减去对应的均值,最后得到 0 均值的特征。标准化也非常简单,在数据变成 0 均值之后,为了使得不同的特征维度有着相同的规模,可以除以标准差近似为一个标准正态分布,也可以依据最大值和最小值将其转化为 -1 ~ 1之间,这两种方法非常的常见,如果你还记得,前面我们在神经网络的部分就已经使用了这个方法实现了数据标准化,至于另外一些方法,比如 PCA 或者 白噪声已经用得非常少了。

Batch Normalization

前面在数据预处理的时候,尽量输入特征不相关且满足一个标准的正态分布,

这样模型的表现一般也较好。但是对于很深的网路结构,网路的非线性层会使得输出的结果变得相关,且不再满足一个标准的 N(0, 1) 的分布,甚至输出的中心已经发生了偏移,这对于模型的训练,特别是深层的模型训练非常的困难。

所以在 2015 年一篇论文提出了这个方法,批标准化,简而言之,就是对于每一层网络的输出,对其做一个归一化,使其服从标准的正态分布,这样后一层网络的输入也是一个标准的正态分布,所以能够比较好的进行训练,加快收敛速度。batch normalization 的实现非常简单,对于给定的一个 batch 的数据

算法的公式如下

第一行和第二行是计算出一个 batch 中数据的均值和方差,接着使用第三个公式对 batch 中的每个数据点做标准化,ϵ是为了计算稳定引入的一个小的常数,通常取

,最后利用权重修正得到最后的输出结果,非常的简单,

实现一下简单的一维的情况,也就是神经网络中的情况

import sys

sys.path.append('..')

import torch

def simple_batch_norm_1d(x, gamma, beta):

eps = 1e-5

x_mean = torch.mean(x, dim=0, keepdim=True) # 保留维度进行 broadcast

x_var = torch.mean((x - x_mean) ** 2, dim=0, keepdim=True)

x_hat = (x - x_mean) / torch.sqrt(x_var + eps)

return gamma.view_as(x_mean) * x_hat + beta.view_as(x_mean)

x = torch.arange(15).view(5, 3)

gamma = torch.ones(x.shape[1])

beta = torch.zeros(x.shape[1])

print('before bn: ')

print(x)

y = simple_batch_norm_1d(x, gamma, beta)

print('after bn: ')

print(y)

可以看到这里一共是 5 个数据点࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值