1. BatchNorm
主要具有以下特性:
- 更快的训练速度:由于 BatchNorm 的权重分布差异很小(论文中称为 internal covariate shift),我们可以使用更高的学习率来训练网络,让我们朝向损失函数最小的方向前进。
- 改进网络正则化(Regularization):通过 BatchNorm 可以使网络在训练的时候,每个 batch 里的数据规范化都是不一样的,有助于减少网络过拟合。
- 提高准确率:由于上述两点,整体上可以提高准确率。
class torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True,track_running_stats=True)
对小批量(mini-batch)的2d或3d输入进行批标准化(Batch Normalization)操作
gamma与beta是可学习的大小为C的参数向量(C为输入大小)
在训练时,该层计算每次输入的均值与方差,并进行移动平均。移动平均默认的动量值为0.1。
在验证时,训练求得的均值/方差将用于标准化验证数据。
参数:
- num_features: 来自期望输入的特征数
- eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
- momentum: 动态均值和动态方差所使用的动量。默认为0.1。
- affine: 一个布尔值,当设为true,给该层添加可学习的仿射变换参数。
- track_running_stats:True表示跟踪整个训练过程中的batch的统计特性,得到方差和均值,而不只是仅仅依赖与当前输入的batch的统计特性。
Shape:
- 输入:(N, C)或者(N, C, L)
- 输出:(N, C)或者(N,C,L)(输入输出相同)
same use:
class torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True)
- 输入:(N, C,H, W) - 输出:(N, C, H, W)
class torch.nn.BatchNorm3d(num_features, eps=1e-05, momentum=0.1, affine=True)
- 输入:(N, C,D, H, W) - 输出:(N, C, D, H, W)
特别注意:Transfer Learning
通常我们在进行 Transfer Learning 的时候,会冻结之前的网络权重,注意这时候往往也会冻结 BatchNorm 中训练好的 moving averages 值。这写 moving averages 值只适用于以前的旧的数据,对新数据不一定适用。所以最好的方法是在 Transfer Learning 的时候不要冻结 BatchNorm 层,让 moving averages 重新从新的数据中学习。
存疑的地方:
batch_norm 在test的时候,用的是固定的mean和var, 而这个固定的mean和var是通过训练过程中对mean和var进行移动平均得到的。而直接使用train_op会使得模型没有计算mean和var。所以在测试时是否需要更新mean和var?
2. Pool
(1)
class torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
- kernel_size(
int
ortuple
) - max pooling的窗口大小 - stride(
int
ortuple
,optional
) - max pooling的窗口移动的步长。默认值是kernel_size
- padding(
int
ortuple
,optional
) - 输入的每一条边补充0的层数 - dilation(
int
ortuple
,optional
) – 一个控制窗口中元素步幅的参数 - return_indices - 如果等于
True
,会返回输出最大值的序号,对于上采样操作会有帮助 - ceil_mode - 如果等于
True
,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作
输入: (N,C,L_in)
输出: (N,C,L_out)
L_{out}=floor((L_{in} + 2padding - dilation(kernel_size - 1) - 1)/stride + 1
L_{out}=(L_{in} + 2padding - kernel_size )/stride + 1
same use:
class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
class torch.nn.MaxPool3d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
class torch.nn.AvgPool1d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)
- ceil_mode - 如果等于
True
,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作 - count_include_pad - 如果等于
True
,计算平均池化时,将包括padding
填充的0
(2)
class torch.nn.AdaptiveMaxPool1d(output_size, return_indices=False)
对输入信号,提供1维的自适应最大池化操作 对于任何输入大小的输入,可以将输出尺寸指定为H,但是输入和输出特征的数目不会变化。
参数:
- output_size: 输出信号的尺寸
- return_indices: 如果设置为
True
,会返回输出的索引。
class torch.nn.AdaptiveMaxPool2d(output_size, return_indices=False)
对输入信号,提供2维的自适应最大池化操作 对于任何输入大小的输入,可以将输出尺寸指定为H*W,但是输入和输出特征的数目不会变化。
参数:
- output_size: 输出信号的尺寸,可以用(H,W)表示
H*W
的输出,也可以使用数字H
表示H*H
大小的输出
same use: