BatchNorm和Pool使用

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 or tuple) - max pooling的窗口大小
  • stride(int or tuple, optional) - max pooling的窗口移动的步长。默认值是kernel_size
  • padding(int or tuple, optional) - 输入的每一条边补充0的层数
  • dilation(int or tuple, 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:

class torch.nn.AdaptiveAvgPool1d(output_size)

class torch.nn.AdaptiveAvgPool2d(output_size)

发布了31 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weijie_home/article/details/104760624