没有合适的资源?快使用搜索试试~ 我知道了~
Pytorch 深度学习 Day03 —批量归一化与残差网格
2 下载量 20 浏览量
2021-01-06
20:35:54
上传
评论
收藏 288KB PDF 举报
温馨提示
批量归一化 批量归一化的提出正是为了应对深度模型训练的挑战。在模型训练时,批量归一化利用小批量上的均值和标准差,不断调整神经网络中间输出,从而使整个神经网络在各层的中间输出的数值更稳定。批量归一化和下一节将要介绍的残差网络为训练和设计深度模型提供了两类重要思路。 批量归一化曾 对全连接层和卷积层做批量归一化的方法稍有不同。下面我们将分别介绍这两种情况下的批量归一化。 对全连接层做批量归一化 我们先考虑如何对全连接层做批量归一化。通常,我们将批量归一化层置于全连接层中的仿射变换和激活函数之间。设全连接层的输入为 u ,权重参数和偏差参数分别为 W 和 b ,激活函数为 ϕ 。设批量归一化的运算符
资源推荐
资源详情
资源评论
Pytorch 深度学习深度学习 Day03 —批量归一化与残差网格批量归一化与残差网格
批量归一化批量归一化
批量归一化的提出正是为了应对深度模型训练的挑战。在模型训练时,批量归一化利用小批量上的均值和标准差,不断调整神经网络中间输出,从而使整个神经网络在各层的中间输
出的数值更稳定。批量归一化和下一节将要介绍的残差网络为训练和设计深度模型提供了两类重要思路。
批量归一化曾批量归一化曾
对全连接层和卷积层做批量归一化的方法稍有不同。下面我们将分别介绍这两种情况下的批量归一化。
对全连接层做批量归一化对全连接层做批量归一化
我们先考虑如何对全连接层做批量归一化。通常,我们将批量归一化层置于全连接层中的仿射变换和激活函数之间。设全连接层的输入为 u ,权重参数和偏差参数分别为 W 和 b ,
激活函数为 ϕ 。设批量归一化的运算符为 BN 。那么,使用批量归一化的全连接层的输出为
**ϕ(BN(x)),**其中批量归一化输入 x 由仿射变换 x=Wu+b得到。考虑一个由 m 个样本组成的小批量,仿射变换的输出为一个新的小批量 B={x(1),…,x(m)} 。它们正是批量归一化层的
输入。对于小批量 B 中任意样本 x(i)∈Rd,1≤i≤m ,批量归一化层的输出同样是 d 维向量:
这里 ϵ>0 是一个很小的常数,保证分母大于0。在上面标准化的基础上,批量归一化层引入了两个可以学习的模型参数,拉伸(scale)参数 γ 和偏移(shift)参数 β 。这两个参数和
x(i) 形状相同,皆为 d 维向量。它们与 x^(i) 分别做按元素乘法(符号 ⊙ )和加法计算:
**y(i)←γ⊙x^(i)+β.**
至此,我们得到了 x(i) 的批量归一化的输出 y(i) 。 值得注意的是,可学习的拉伸和偏移参数保留了不对 x(i) 做批量归一化的可能:此时只需学出 γ=σ2B+ϵ−−−−−√ 和 β=μB 。我们可
以对此这样理解:如果批量归一化无益,理论上,学出的模型可以不使用批量归一化。
对卷积层做批量归一化对卷积层做批量归一化
对卷积层来说,批量归一化发生在卷积计算之后、应用激活函数之前。如果卷积计算输出多个通道,我们需要对这些通道的输出分别做批量归一化,且每个通道都拥有独立的拉伸和
偏移参数,并均为标量。设小批量中有 m 个样本。在单个通道上,假设卷积计算输出的高和宽分别为 p 和 q 。我们需要对该通道中 m×p×q 个元素同时做批量归一化。对这些元素做
标准化计算时,我们使用相同的均值和方差,即该通道中 m×p×q 个元素的均值和方差。
预测时的批量统一化预测时的批量统一化
使用批量归一化训练时,我们可以将批量大小设得大一点,从而使批量内样本的均值和方差的计算都较为准确。将训练好的模型用于预测时,我们希望模型对于任意输入都有确定的
输出。因此,单个样本的输出不应取决于批量归一化所需要的随机小批量中的均值和方差。一种常用的方法是通过移动平均估算整个训练数据集的样本均值和方差,并在预测时使用
它们得到确定的输出。可见,和丢弃层一样,批量归一化层在训练模式和预测模式下的计算结果也是不一样的。
从零开始实现从零开始实现
import time
import torch
from torch import nn, optim
import torch.nn.functional as F
import torchvision
import sys
sys.path.append("/home/kesci/input/")
import d2lzh1981 as d2l
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
def batch_norm(is_training, X, gamma, beta, moving_mean, moving_var, eps, momentum):
# 判断当前模式是训练模式还是预测模式
if not is_training:
# 如果是在预测模式下,直接使用传入的移动平均所得的均值和方差
X_hat = (X - moving_mean) / torch.sqrt(moving_var + eps)
else:
assert len(X.shape) in (2, 4)
if len(X.shape) == 2:
# 使用全连接层的情况,计算特征维上的均值和方差
mean = X.mean(dim=0)
var = ((X - mean) ** 2).mean(dim=0)
else:
# 使用二维卷积层的情况,计算通道维上(axis=1)的均值和方差。这里我们需要保持
# X的形状以便后面可以做广播运算
mean = X.mean(dim=0, keepdim=True).mean(dim=2, keepdim=True).mean(dim=3, keepdim=True)
var = ((X - mean) ** 2).mean(dim=0, keepdim=True).mean(dim=2, keepdim=True).mean(dim=3, keepdim=True)
# 训练模式下用当前的均值和方差做标准化
X_hat = (X - mean) / torch.sqrt(var + eps)
# 更新移动平均的均值和方差
moving_mean = momentum * moving_mean + (1.0 - momentum) * mean
moving_var = momentum * moving_var + (1.0 - momentum) * var
Y = gamma * X_hat + beta # 拉伸和偏移
return Y, moving_mean, moving_var
接下来,我们自定义一个BatchNorm层。它保存参与求梯度和迭代的拉伸参数gamma和偏移参数beta,同时也维护移动平均得到的均值和方差,以便能够在模型预测时被使用。
BatchNorm实例所需指定的num_features参数对于全连接层来说应为输出个数,对于卷积层来说则为输出通道数。该实例所需指定的num_dims参数对于全连接层和卷积层来说分别
资源评论
weixin_38610682
- 粉丝: 6
- 资源: 878
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功