网站做弹幕广告,网站版式设计说明,少儿编程免费加盟,广告文案生成器目录 一、BN层介绍
1、深层神经网络存在的问题
2、批量归一化公式的数学推导
3、BN层的作用位置
4、 预测过程中的批量归一化
5、BN层加速模型训练的原因
6、总结
二、批量归一化从零实现
1、实现批量归一化操作
2、创建BN层
3、对LeNet加入批量归一化
4、开始训练…目录 一、BN层介绍
1、深层神经网络存在的问题
2、批量归一化公式的数学推导
3、BN层的作用位置
4、 预测过程中的批量归一化
5、BN层加速模型训练的原因
6、总结
二、批量归一化从零实现
1、实现批量归一化操作
2、创建BN层
3、对LeNet加入批量归一化
4、开始训练
三、简明实现
1、对LeNet加入批量归一化
2、开始训练 一、BN层介绍 批量归一化Batch Normalization是一种用于深度神经网络的常用技术旨在加快模型的训练速度、提高模型的稳定性和泛化能力。
1、深层神经网络存在的问题 在深度神经网络中反向传播算法用于计算网络参数的梯度以便通过梯度下降等优化算法来更新参数。损失函数在神经网络的上层计算损失梯度在反向传播过程中会逐层传递通过链式法则计算每一层的梯度就导致上层梯度大而下层梯度小。当网络层数很深时梯度在传递过程中可能会变得非常小甚至趋近于零这就是梯度消失问题。 梯度消失问题会导致深层网络的参数难以更新因为梯度信息无法有效地传播回浅层网络。这会导致浅层网络的参数在训练过程中几乎不会得到更新导致收敛速度较慢从而影响了整个网络的训练效果。 2、批量归一化公式的数学推导 请注意我们在方差估计值中添加一个小的常量 以确保我们永远不会尝试除以零。应用标准化()后生成的小批量的平均值为0和单位方差为1。由于单位方差是一个主观的选择因此需要重新学习一个新的拉伸参数(scale) 和偏移参数(shift) 。 因此的均值为方差为。 因此的均值为0方差为1。 因此的均值为方差为。 样本减去其均值后除以方差的操作被称为标准化或归一化。这种操作常用于统计分析和机器学习中。 3、BN层的作用位置 4、 预测过程中的批量归一化 批量规一化在训练模式和预测模式下的行为通常不同。在预测模式下我们使用训练时得到的移动平均均值(moving_mean)和方差(moving_var)来进行归一化而不是使用验证集的数据重新计算。批量归一化在训练模式和预测模式下的行为不同这一点和暂退法(丢弃法)有点像。
5、BN层加速模型训练的原因 批量归一化Batch Normalization在深度学习中能够加快模型训练速度的原因主要有以下几点 缓解梯度消失问题在深层神经网络中梯度消失是一个常见的问题导致较深层的梯度信息无法有效地传播回浅层网络。批量归一化通过对每一层的输入进行标准化使得输入数据的均值接近0方差接近1从而使得激活函数的输入范围更加适中避免了输入数据过大或过小激活函数在其有效范围内具有较大的导数值从而使得梯度能够更好地通过网络传播。这样即使在深层网络中梯度仍然可以有效地反向传播从而保持参数的更新缓解梯度消失问题加速模型的训练过程。 加速收敛批量归一化通过标准化每一层的输入将数据分布调整为接近标准正态分布使得网络的参数更容易学习。这有助于加快模型的收敛速度减少训练的迭代次数从而加速模型的训练过程。 增加学习率批量归一化使得网络中的各层输入具有相对较小的变化范围从而增加了模型对学习率的鲁棒性。较大的学习率可以加速模型的收敛同时避免了因为学习率过大导致的不稳定性。 正则化效果批量归一化本质上对每一层的输入进行了规范化处理类似于一种正则化的效果。它在一定程度上减少了模型对输入数据的依赖增强了模型的泛化能力有助于防止过拟合。 总的来说批量归一化通过标准化每一层的输入数据缓解梯度消失问题加快模型的收敛速度增加学习率和正则化效果从而有效地加快模型的训练速度。
6、总结
批量归一化固定小批量中的均值和方差然后学习出适合的偏移和缩放可以加速收敛速度但一般不改变模型精度
二、批量归一化从零实现
1、实现批量归一化操作 下面我们从头开始实现一个具有张量的批量规范化层。
import torch
from torch import nn
from d2l import torch as d2ldef batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum): # X:输入 gamma,beta:可学习参数γ,β moving_mean,moving_var:全局均值和方差做推理时用 eps:避免除0的东西 momentum:用来更新γ,β的参数# 通过is_grad_enabled来判断当前模式是训练模式还是预测模式if not torch.is_grad_enabled():# 如果是在预测模式下直接使用传入的移动平均所得的均值和方差X_hat (X - moving_mean) / torch.sqrt(moving_var eps)else:assert len(X.shape) in (2, 4) # 等于2的话就是全连接层等于4的话就是卷积层if len(X.shape) 2:# 使用全连接层的情况计算特征维上的均值和方差mean X.mean(dim0) # 二维的话第一维是批量大小(行)第二维是特征(列)dim0表示每一列算出一个均值var ((X - mean) ** 2).mean(dim0)else:# 使用二维卷积层的情况计算通道维上axis1的均值和方差。# 这里我们需要保持X的形状以便后面可以做广播运算mean X.mean(dim(0, 2, 3), keepdimTrue)var ((X - mean) ** 2).mean(dim(0, 2, 3), keepdimTrue)# 训练模式下用当前的均值和方差做标准化X_hat (X - mean) / torch.sqrt(var eps)# 更新移动平均的均值和方差moving_mean momentum * moving_mean (1.0 - momentum) * meanmoving_var momentum * moving_var (1.0 - momentum) * varY gamma * X_hat beta # 缩放和移位return Y, moving_mean.data, moving_var.data momentum 是一个介于 0 和 1 之间的超参数用于控制移动平均的更新速度。在批量归一化中为了减少每个批次数据的波动对均值和方差的影响通常会计算移动平均的均值和方差。这样可以提供更稳定的均值和方差估计从而使得批量归一化在测试阶段也能够起到归一化的效果。在测试阶段使用移动平均的均值和方差来对数据进行归一化以保持与训练阶段的一致性。 self.moving_mean 和 self.moving_var 需要在前向传播过程中与输入数据 X 在相同的设备上进行计算所以需要使用 .to(X.device) 进行设备转移操作。而 self.gamma 和 self.beta 是可学习参数已经被定义为 nn.Parameter会自动根据模型所在的设备进行初始化所以不需要额外的设备转移操作。 在全连接层中输入数据的维度通常为两个分别是 批量大小Batch Size表示一次输入的样本数量即一批数据的大小。通常用于同时处理多个样本以利用并行计算的优势。特征维度Feature Dimension表示每个样本在全连接层中的特征表示。这个维度的大小可以根据任务和网络设计进行调整通常是通过将输入数据展平flatten为一维向量来实现。展平操作将多维的输入数据转换为一维的特征向量作为全连接层的输入。 例如如果输入数据的维度为[batch_size, num_features]其中batch_size表示批量大小num_features表示每个样本的特征维度那么全连接层的两个维度就分别是batch_size和num_features。 2、创建BN层 我们现在可以创建一个正确的BatchNorm层。这个层将保持适当的参数拉伸gamma和偏移beta这两个参数将在训练过程中更新。此外我们的层将保存均值和方差的移动平均值以便在模型预测期间随后使用。 撇开算法细节注意我们实现层的基础设计模式。通常情况下我们用一个单独的函数定义其数学原理比如说batch_norm。然后我们将此功能集成到一个自定义层中其代码主要处理数据移动到训练设备如GPU、分配和初始化任何必需的变量、跟踪移动平均线此处为均值和方差等问题。为了方便起见我们并不担心在这里自动推断输入形状因此我们需要指定整个特征的数量。
class BatchNorm(nn.Module):# num_features全连接层的输出数量或卷积层的输出通道数。# num_dims2表示完全连接层4表示卷积层def __init__(self, num_features, num_dims):super().__init__()if num_dims 2:shape (1, num_features) # (batch_size, num_features)else:shape (1, num_features, 1, 1) # (batch_size, channel, height, width)# 参与求梯度和迭代的拉伸和偏移参数分别初始化成1和0self.gamma nn.Parameter(torch.ones(shape))self.beta nn.Parameter(torch.zeros(shape))# 非模型参数的变量初始化为0和1self.moving_mean torch.zeros(shape)self.moving_var torch.ones(shape)def forward(self, 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)# 保存更新过的moving_mean和moving_var等待下一个批量进来继续更新直到整个训练过程完全结束Y, self.moving_mean, self.moving_var batch_norm(X, self.gamma, self.beta, self.moving_mean,self.moving_var, eps1e-5, momentum0.9) # 预测模式下不更新self.moving_mean和self.moving_var只在训练模式下更新return Y 在PyTorch中nn.Parameter是一个特殊的张量它被用作模型的可学习参数。当我们使用nn.Parameter包装一个张量时PyTorch会自动将其标记为模型参数使得在模型的训练过程中可以对其进行自动求导和更新。 在这段代码中self.gamma和self.beta是可学习参数它们用于缩放gamma和偏移beta归一化后的数据。因此我们需要使用nn.Parameter将这两个张量标记为模型参数以便可以对它们进行自动求导和更新。 而self.moving_mean和self.moving_var是批量归一化层中的非模型参数。它们用于保存移动平均的均值和方差在训练过程中会被更新。但是它们不是模型的可学习参数因此不需要使用nn.Parameter进行标记。
3、对LeNet加入批量归一化 为了更好理解如何应用BatchNorm下面我们将其应用于LeNet模型。批量规范化是在卷积层或全连接层之后、相应的激活函数之前应用的。
net nn.Sequential(nn.Conv2d(1, 6, kernel_size5), BatchNorm(6, num_dims4), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), BatchNorm(16, num_dims4), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2), nn.Flatten(),nn.Linear(16*4*4, 120), BatchNorm(120, num_dims2), nn.Sigmoid(),nn.Linear(120, 84), BatchNorm(84, num_dims2), nn.Sigmoid(),nn.Linear(84, 10))
4、开始训练 和以前一样我们将在Fashion-MNIST数据集上训练网络。这个代码与我们第一次训练LeNet时几乎完全相同主要区别在于学习率大得多。
lr, num_epochs, batch_size 1.0, 10, 256
train_iter, test_iter d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
loss 0.273, train acc 0.899, test acc 0.807
32293.9 examples/sec on cuda:0 让我们来看看从第一个批量规范化层中学到的拉伸参数gamma和偏移参数beta。
net[1].gamma.reshape((-1,)), net[1].beta.reshape((-1,))
(tensor([0.4863, 2.8573, 2.3190, 4.3188, 3.8588, 1.7942], devicecuda:0,grad_fnReshapeAliasBackward0),tensor([-0.0124, 1.4839, -1.7753, 2.3564, -3.8801, -2.1589], devicecuda:0,grad_fnReshapeAliasBackward0))
三、简明实现
1、对LeNet加入批量归一化 除了使用我们刚刚定义的BatchNorm我们也可以直接使用深度学习框架中定义的BatchNorm。该代码看起来几乎与我们上面的代码相同。
net nn.Sequential(nn.Conv2d(1, 6, kernel_size5), nn.BatchNorm2d(6), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), nn.BatchNorm2d(16), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2), nn.Flatten(),nn.Linear(256, 120), nn.BatchNorm1d(120), nn.Sigmoid(),nn.Linear(120, 84), nn.BatchNorm1d(84), nn.Sigmoid(),nn.Linear(84, 10))
2、开始训练 下面我们使用相同超参数来训练模型。通常高级API变体运行速度快得多因为它的代码已编译为C或CUDA而我们的自定义代码由Python实现。
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
loss 0.267, train acc 0.902, test acc 0.708
50597.3 examples/sec on cuda:0
文章转载自: http://www.morning.fplwz.cn.gov.cn.fplwz.cn http://www.morning.jbfzx.cn.gov.cn.jbfzx.cn http://www.morning.nhpmn.cn.gov.cn.nhpmn.cn http://www.morning.xirfr.cn.gov.cn.xirfr.cn http://www.morning.lqjpb.cn.gov.cn.lqjpb.cn http://www.morning.zhnpj.cn.gov.cn.zhnpj.cn http://www.morning.dbqcw.com.gov.cn.dbqcw.com http://www.morning.wwjft.cn.gov.cn.wwjft.cn http://www.morning.ailvturv.com.gov.cn.ailvturv.com http://www.morning.qdsmile.cn.gov.cn.qdsmile.cn http://www.morning.tssmk.cn.gov.cn.tssmk.cn http://www.morning.qydgk.cn.gov.cn.qydgk.cn http://www.morning.prddj.cn.gov.cn.prddj.cn http://www.morning.cbvlus.cn.gov.cn.cbvlus.cn http://www.morning.dschz.cn.gov.cn.dschz.cn http://www.morning.lmjkn.cn.gov.cn.lmjkn.cn http://www.morning.rnnq.cn.gov.cn.rnnq.cn http://www.morning.pfggj.cn.gov.cn.pfggj.cn http://www.morning.ns3nt8.cn.gov.cn.ns3nt8.cn http://www.morning.bftr.cn.gov.cn.bftr.cn http://www.morning.tgwfn.cn.gov.cn.tgwfn.cn http://www.morning.hhmfp.cn.gov.cn.hhmfp.cn http://www.morning.kxxld.cn.gov.cn.kxxld.cn http://www.morning.frsxt.cn.gov.cn.frsxt.cn http://www.morning.nwmwp.cn.gov.cn.nwmwp.cn http://www.morning.qkrgk.cn.gov.cn.qkrgk.cn http://www.morning.pwqyd.cn.gov.cn.pwqyd.cn http://www.morning.xfyjn.cn.gov.cn.xfyjn.cn http://www.morning.srgsb.cn.gov.cn.srgsb.cn http://www.morning.pxlsh.cn.gov.cn.pxlsh.cn http://www.morning.nicetj.com.gov.cn.nicetj.com http://www.morning.hdrsr.cn.gov.cn.hdrsr.cn http://www.morning.jqkjr.cn.gov.cn.jqkjr.cn http://www.morning.ntgjm.cn.gov.cn.ntgjm.cn http://www.morning.bnlsd.cn.gov.cn.bnlsd.cn http://www.morning.ggxbyhk.cn.gov.cn.ggxbyhk.cn http://www.morning.txqsm.cn.gov.cn.txqsm.cn http://www.morning.lxqkt.cn.gov.cn.lxqkt.cn http://www.morning.tfbpz.cn.gov.cn.tfbpz.cn http://www.morning.phxns.cn.gov.cn.phxns.cn http://www.morning.kzpy.cn.gov.cn.kzpy.cn http://www.morning.drkk.cn.gov.cn.drkk.cn http://www.morning.dycbp.cn.gov.cn.dycbp.cn http://www.morning.wkpfm.cn.gov.cn.wkpfm.cn http://www.morning.sqhtg.cn.gov.cn.sqhtg.cn http://www.morning.llyjx.cn.gov.cn.llyjx.cn http://www.morning.rytps.cn.gov.cn.rytps.cn http://www.morning.rbzd.cn.gov.cn.rbzd.cn http://www.morning.dhwyl.cn.gov.cn.dhwyl.cn http://www.morning.rxhsm.cn.gov.cn.rxhsm.cn http://www.morning.trqzk.cn.gov.cn.trqzk.cn http://www.morning.bssjp.cn.gov.cn.bssjp.cn http://www.morning.dpdns.cn.gov.cn.dpdns.cn http://www.morning.gjws.cn.gov.cn.gjws.cn http://www.morning.lgcqj.cn.gov.cn.lgcqj.cn http://www.morning.lbzgt.cn.gov.cn.lbzgt.cn http://www.morning.qlsbz.cn.gov.cn.qlsbz.cn http://www.morning.ptlwt.cn.gov.cn.ptlwt.cn http://www.morning.nzmqn.cn.gov.cn.nzmqn.cn http://www.morning.kzbpx.cn.gov.cn.kzbpx.cn http://www.morning.nlffl.cn.gov.cn.nlffl.cn http://www.morning.tytly.cn.gov.cn.tytly.cn http://www.morning.rltsx.cn.gov.cn.rltsx.cn http://www.morning.qkgwx.cn.gov.cn.qkgwx.cn http://www.morning.jwlmm.cn.gov.cn.jwlmm.cn http://www.morning.lpmjr.cn.gov.cn.lpmjr.cn http://www.morning.nwcgj.cn.gov.cn.nwcgj.cn http://www.morning.llxns.cn.gov.cn.llxns.cn http://www.morning.lgsqy.cn.gov.cn.lgsqy.cn http://www.morning.bzbq.cn.gov.cn.bzbq.cn http://www.morning.smwlr.cn.gov.cn.smwlr.cn http://www.morning.alive-8.com.gov.cn.alive-8.com http://www.morning.cwqln.cn.gov.cn.cwqln.cn http://www.morning.rxgnn.cn.gov.cn.rxgnn.cn http://www.morning.webpapua.com.gov.cn.webpapua.com http://www.morning.srgyj.cn.gov.cn.srgyj.cn http://www.morning.pprxs.cn.gov.cn.pprxs.cn http://www.morning.bplqh.cn.gov.cn.bplqh.cn http://www.morning.lltdf.cn.gov.cn.lltdf.cn http://www.morning.jnbsx.cn.gov.cn.jnbsx.cn