nn.BatchNorm2d()函数,BasicConv2d()

本文深入解析1*1卷积的作用,包括降维、增加非线性及计算效率提升,同时详述PyTorch中nn.BatchNorm2d()函数的功能与参数,如num_features、eps、momentum及affine选项,帮助读者理解其在网络训练中的关键作用。
部署运行你感兴趣的模型镜像


BasicConv2d()代码讲解:

class BasicConv2d(nn.Module): #nn.Module是nn中十分重要的类,包含网络各层的定义及forward方法
	
	def __init__(self, in_planes, out_planes, kernel_size, stride, padding = 0):
		 # nn.Module的子类函数必须在构造函数中执行父类的构造函数
		super(BasicConv2d, self).__init__()    # 等价与nn.Module.__init__()
		self.conv = nn.Conv2d(in_planes, out_planes,
								kernel_size = kernel_size, stride = stride,
								padding = padding, bias = False    #如果bias=True,添加偏置
							 ) # verify bias false
		self.bn = nn.BatchNorm2d(out_planes,
								eps=0.001, # value found in tensorflow
								momentum=0.1, # default pytorch value
								affine=True)
		self.relu = nn.ReLU(inplace = True)

	def forward(self, x):   #前向传播
		
		x = self.relu(self.bn(self.conv(x)))
		return x

1*1卷积的作用

  1. 降维。500 * 500 * 100的图片在20个filter上面做1 * 1卷积,结果大小为500* 500* 20
  2. 加入非线性。卷积层之后经过激励层,1* 1的卷积在前一层的学习表示上添加了非线性激励,提升网络的表达能力
  3. 1* 1卷积不改变feature map大小,只改变channel数,相比于3x3卷积,1* 1计算量更小
    (当1* 1卷积出现时,在大多数情况下它作用是升/降特征的维度,这里的维度指的是通道数(厚度),而不改变图片的宽和高。)

nn.BatchNorm2d()函数

作用

根据统计的mean 和var来对数据进行标准化,并且这个mena和var在每个batch中都会进行,为了使得数据更有统计意义,使得整个训练数据的特征都能够被保存,则在每个batch过程中,都会对网络的mean和var进行更新
参考

参数

num_features:一般情况下输入的数据格式为batch_size * num_features * height * width,即为特征数,channel数

eps:分母中添加的一个值,目的是为了计算的稳定性

momentum:一个用于运行过程中均值和方差的一个估计参数,默认值为0.1;
xˆnew=(1−momentum)×xˆ+momentum×xt,其中xˆ是估计值,xt是新的观测值
这个参数越大,代表当前batch产生的统计数据的重要性越强。

affine:当设为true时,给定可以学习的系数矩阵γ和β。如果affine=False则γ=1,β=0 ,并且不能学习被更新。一般都会设置成affine=True。

nn.Conv2d

对由多个输入平面组成的输入信号进行二维卷积。输入信号的形式为(N,C_{in},H,W) ,

nn.ConvTranspose2d

进行反卷积操作

class BasicTransConv2d(nn.Module):
	
	def __init__(self, in_planes, out_planes, kernel_size, stride, padding = 0):
		
		super(BasicTransConv2d, self).__init__()
		self.transconv = nn.ConvTranspose2d(in_planes, out_planes,    #进行反卷积操作
											kernel_size = kernel_size, stride = stride,
											padding = padding, bias = False)
		self.bn = nn.BatchNorm2d(out_planes,
								eps=0.001, # value found in tensorflow
								momentum=0.1, # default pytorch value
								affine=True)
		self.relu = nn.ReLU(inplace = True)
		
	def forward(self, x):
		
		x = self.relu(self.bn(self.transconv(x)))
		return x

nn.Conv2d和nn.ConvTranspose2d详细描述参考:https://blog.youkuaiyun.com/demo_jie/article/details/107311774

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>我们正在讨论PyTorch中的`nn.BatchNorm2d`模块。用户希望了解其函数原型和使用方法。 根据之前的讨论,我们已经详细介绍了`nn.BatchNorm2d`的原理、参数和使用示例。 现在,用户直接要求函数原型和使用方法,我们可以从官方文档和源码角度进行说明。 函数原型(即构造函数参数)已经在之前的回答中给出,但我们可以更正式地列出。 注意:用户提供了几个引用,其中引用[1]指向了nn.Module的源码,引用[2]是PyTorch基础知识的介绍,引用[3]是nn.Module的内部结构。 这些引用虽然不是直接关于BatchNorm2d,但我们可以参考其格式。 由于用户要求的是函数原型(function signature)和使用方法,我们将重点放在这两个方面。 根据PyTorch官方文档,`torch.nn.BatchNorm2d`的签名如下: torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, device=None, dtype=None) 参数解释: 1. num_features (int): 来自期望输入的通道数,即输入张量的通道数C。 2. eps (float): 为数值稳定性而添加到分母的值。默认值:1e-5。 3. momentum (float): 用于运行均值和运行方差的动量值。如果设置为None,则使用累积移动平均(即简单平均)。默认值:0.1。 4. affine (bool): 当设置为True时,该模块具有可学习的仿射参数(即缩放因子gamma和偏置项beta)。默认值:True。 5. track_running_stats (bool): 当设置为True时,该模块跟踪运行均值和方差;如果设置为False,则不跟踪,并且在训练和评估模式都使用批统计量。默认值:True。 6. device (torch.device, 可选): 模块参数和缓冲区的设备。 7. dtype (torch.dtype, 可选): 模块参数和缓冲区的数据类型。 使用方法: 在定义模型时,通常将BatchNorm2d层放在卷积层之后,激活函数之前(也有放在激活函数之后的,但常见的是在激活函数之前)。在模型的前向传播中,按照顺序通过各层。 我们还可以参考源码中的说明(虽然不是直接给出,但我们可以根据官方文档和之前的知识总结)。 下面我们给出一个使用示例,并解释每一步。 注意:用户已经看到过示例,但我们可以再给一个更详细的,并配合解释。 同时,根据要求,我们需要生成相关问题。</think>### PyTorch `nn.BatchNorm2d` 函数原型与使用详解 #### 函数原型 ```python torch.nn.BatchNorm2d( num_features: int, # 输入特征图的通道数 eps: float = 1e-5, # 数值稳定项(防止除零) momentum: float = 0.1, # 运行统计量更新系数 affine: bool = True, # 是否启用可学习参数γ/β track_running_stats: bool = True, # 是否记录移动平均统计量 device=None, # 计算设备 dtype=None # 数据类型 ) -> None ``` [^1] #### 核心参数说明 | 参数 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `num_features` | int | - | **必须参数**,输入特征图的通道数 $C$ | | `eps` | float | $10^{-5}$ | 添加到方差的小常数,防止数值不稳定 | | `momentum` | float | 0.1 | 运行统计量更新系数:$0 \leq \alpha \leq 1$ | | `affine` | bool | True | 是否启用可学习的缩放参数 $\gamma$ 和偏置参数 $\beta$ | | `track_running_stats` | bool | True | 是否记录全局运行均值 $\mu_{\text{run}}$ 和方差 $\sigma_{\text{run}}^2$ | #### 使用方法示例 ```python import torch import torch.nn as nn # 创建BN层 (输入通道数=64) bn_layer = nn.BatchNorm2d(num_features=64) # 模拟输入数据 (batch_size=8, 64通道, 32x32特征图) inputs = torch.randn(8, 64, 32, 32) # 训练模式:使用当前批统计量 bn_layer.train() output_train = bn_layer(inputs) print(f"训练输出均值: {output_train.mean().item():.4f}") # 应接近0 # 评估模式:使用预存统计量 bn_layer.eval() with torch.no_grad(): output_eval = bn_layer(inputs) print(f"评估输出均值: {output_eval.mean().item():.4f}") ``` #### 关键数学原理 1. **训练阶段计算**: $$ \hat{x} = \frac{x - \mu_{\text{batch}}}{\sqrt{\sigma_{\text{batch}}^2 + \epsilon}} \quad ; \quad y = \gamma \hat{x} + \beta $$ 其中 $\mu_{\text{batch}}$ 和 $\sigma_{\text{batch}}^2$ 是当前批次的统计量[^3]。 2. **运行统计量更新**: $$ \mu_{\text{run}} \leftarrow (1 - \alpha) \cdot \mu_{\text{run}} + \alpha \cdot \mu_{\text{batch}} $$ $$ \sigma_{\text{run}}^2 \leftarrow (1 - \alpha) \cdot \sigma_{\text{run}}^2 + \alpha \cdot \sigma_{\text{batch}}^2 $$ 其中 $\alpha$ 是动量参数 `momentum`。 3. **评估阶段计算**: $$ y = \gamma \cdot \frac{x - \mu_{\text{run}}}{\sqrt{\sigma_{\text{run}}^2 + \epsilon}} + \beta $$ #### 最佳实践建议 1. **通道匹配**:确保前一层的输出通道数等于 `num_features` ```python conv = nn.Conv2d(3, 64, kernel_size=3) # 输出通道=64 bn = nn.BatchNorm2d(64) # 正确匹配 ``` 2. **小批量优化**:当 batch_size < 16 时,建议: ```python # 降低动量值 + 冻结BN层 bn = nn.BatchNorm2d(64, momentum=0.01) for param in bn.parameters(): param.requires_grad = False ``` 3. **参数访问**:查看学习参数 ```python print("缩放参数γ:", bn.weight) # 形状 [64] print("偏置参数β:", bn.bias) # 形状 [64] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值