0%

『论文笔记』On Feature Normalization and Data Augmentation

Information

  • Title: On Feature Normalization and Data Augmentation
  • Author: Boyi Li, Felix Wu, Ser-Nam Lim, Serge Belongie, Kilian Q. Weinberger
  • Institution: Cornell University, Cornell Tech, ASAPP, Facebook AI
  • Year: 2021
  • Journal: CVPR
  • Source: Open access, Arxiv, official PyTorch implementation
  • Cite: Boyi Li, Felix Wu, Ser-Nam Lim, Serge Belongie, Kilian Q. Weinberger; Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2021, pp. 12383-12392
  • Idea: 交换 feature map 的矩信息做数据增强
1
2
3
4
5
6
7
8
@InProceedings{Li_2021_CVPR,
author = {Li, Boyi and Wu, Felix and Lim, Ser-Nam and Belongie, Serge and Weinberger, Kilian Q.},
title = {On Feature Normalization and Data Augmentation},
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
month = {June},
year = {2021},
pages = {12383-12392}
}

Abstract

特征的矩(Moment, 如均值和方差)在包含了一些图像的学习,例如 Instance Normalization 和 Positional Normalization (PONO) 就包含了图像的风格和形状信息。据此作者提出了 Moment Exchange (MoEx),一种隐式数据增强,用于激励模型利用矩信息

Introduction

为了说明一阶矩和二阶矩(即均值和方差)所隐含的信息,作者展示了如下图片

image-20221102210517367

随机特征、只使用矩、使用 Normalized 后的特征、标准的 PONO 其准确率依次升高

image-20221102211218268

可见矩和Norm后的特征都有很重要的信息,所以如何让网络合理分配权重是个值得思考的问题,例如有研究指出卷积网络更关注纹理而不是形状,所以提出生成一些目标类的纹理覆盖到源图像例如生成具有大象皮肤的猫等来强迫模型关注形状信息。

然后作者提出通过交换两个图片的均值和方差来引导模型分配对特征的矩信息和归一化后的信息的关注度

image-20221102223317362

看起来和 ICCV2021 的 CNSN 差不多

Method

在特征空间交换特征的矩特征(均值方差),作者称该操作可以平滑决策边界。 \[ (\hat{\mathbf{h}}_i^\ell, \boldsymbol{\mu}_i^\ell, \boldsymbol{\sigma}_i^\ell) = F(\mathbf{h}_i^\ell),\ \ \mathbf{h}_i^\ell = F^{-1}(\hat{\mathbf{h}}^\ell_i, \boldsymbol{\mu}^\ell_i, \boldsymbol{\sigma}^\ell_i). \] 考虑归一化层\(F\)输出三个值:归一化后的特征(\(\mathbf{h}_i^\ell\))、一阶矩(即均值, \(\mu_i^\ell\))、二阶矩(即方差, \(\sigma_i^\ell\)), \(F^{-1}\) 是其逆过程,其一阶矩和二阶矩使用 PONO 的方法计算: \[ \begin{align*} \boldsymbol{\mu}_{b,h,w}^\ell &= \frac{1}{C} \sum_{c} \mathbf{h}_{b,c,h,w}^\ell, \\ \boldsymbol{\sigma}_{b,h,w}^\ell &= \sqrt{ \frac{1}{C}\sum_{c} \left(\mathbf{h}_{b, c, h, w}^\ell - \boldsymbol{\mu}_{b,h,w}^\ell\right)^2 + \epsilon}. \end{align*} \] 在一般的归一化操作如 BN 中矩信息会被丢弃然后重新学习一个新的矩参数,而在这里,作者提出矩信息对于神经网络的分类也是有益的,所以考虑将其利用起来,怎么利用呢?将 A 图的矩信息和 B 图的矩信息进行交换组合: \[ \mathbf{h}_A^{(B)}= F^{-1}({\hat{\mathbf{h}}}_A,\boldsymbol{\mu}_B,\boldsymbol{\sigma}_B). \] 结合 PONO 就是 \[ \mathbf{h}_A^{(B)} = \boldsymbol{\sigma}_B \frac{\mathbf{h}_A - \boldsymbol{\mu}_A}{\boldsymbol{\sigma}_A} + \boldsymbol{\mu}_B. \] 为了鼓励神经网络注意到加入的其他图片的特征,作者对损失函数的预测标签添加了一个混合常数 \(\lambda \in [0, 1]\) ,此时损失函数为 \[ \lambda \cdot \ell(\mathbf{h}_{A}^{(B)}, y_{A}) + (1 - \lambda) \cdot \ell(\mathbf{h}_{A}^{(B)}, y_{B}). \]

Detail

Implementation

作者注意到在使用 PONO 的时候在第一层添加 MoEx 效果最好,而使用 IN, GN, LN 的时候在后面的层添加效果更好,这个后面有消融实验。

MoEx 的实现也很简单,对给定的小批量样本,随机采样序列 \(\pi\) 然后应用到每一对特征上即可: \[ \mathbf{h}_i^{\left(\pi(i)\right)}\leftarrow F^{-1}({\hat{\mathbf{h}}}_i,\boldsymbol{\mu}_{\pi(i)},\boldsymbol{\sigma}_{\pi(i)}). \]

Hyper-parameters

为了控制数据增强的强度,作者并不提出以一定概率 \(p\) 对数据施加 MoEx,此时模型有 \(1 - p\) 的概率得到原图,实验中 \(p = 0.5\) 效果较好。另一个参数是 \(\lambda\) ,实验表明 \(\lambda = 0.9\) 效果较好,这可能是因为归一化后的特征包含的信息比矩特征更多的原因。

Experiment

Classification

  • 数据集:CIFAR-10, CIFAR-100,ImageNet
  • 模型:PyramidNet-200

CIFAR-10CIFAR-100 结果

image-20221103155443032

image-20221103155354239

ImageNet 结果

image-20221103155617652

Object Detection

image-20221103155743144

3d model classification

image-20221103155831863

Ablation study

image-20221103155912074

image-20221103155920693

image-20221103155930908

image-20221103155948126

image-20221103160206576

其他任务

image-20221103160224661

Conclusion

作者提出了一种新的数据增强方法 MoEx ,其将归一化层中提取的矩特征利用起来,并使网络特别注意这些特征。效果很好,很容易实现,很容易与现有的许多方法联合使用。

Others

Code

作者在附加材料中给出了 Pytorch 的实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# x: a batch of features of shape (batch_size,
# channels, height, width),
# y: onehot labels of shape (batch_size, n_classes)
# norm_type: type of the normalization to use

def moex(x, y, norm_type):
x, mean, std = normalization(x, norm_type)
ex_index = torch.randperm(x.shape[0])
x = x * std[ex_index] + mean[ex_index]
y_b = y[ex_index]
return x, y, y_b

# output: model output
# y: original labels
# y_b: labels of moments
# loss_func: loss function used originally
# lam: interpolation weight $\lambda$
def interpolate_loss(output, y, y_b, loss_func, lam):
return lam * loss_func(output, y) + (1. - lam) * loss_func(output, y_b)

def normalization(x, norm_type, epsilon=1e-5):
# decide how to compute the moments
if norm_type == 'pono':
norm_dims = [1]
elif norm_type == 'instance_norm':
norm_dims = [2, 3]
else: # layer norm
norm_dims = [1, 2, 3]
# compute the moments
mean = x.mean(dim=norm_dims, keepdim=True)
var = x.var(dim=norm_dims, keepdim=True)
std = (var + epsilon).sqrt()
# normalize the features, i.e., remove the moments
x = (x - mean) / std
return x, mean, std

Compare CNSN

与 CNSN[1] 的方法相比,总的思想是十分类似的,即交换 feature map 的均值和方差做数据增强,说说两种方法的不同

  • CNSN 的 CN 与 MoEx 类似,但除此之外还提出了 SN 的方法
  • CNSN 的操作主要针对图像风格,即在通道上做交换,即基于 IN 的,而 MoEx 没有特别提到具体维度,其文章中说明的主要是基于 PONO 的
  • CNSN 提出了三种交换方法,分别是单个图片内通道交换、两图片对应交换、两图片区域交换,这点做得比 MoEx 更加细致(后续补充,看代码时发现虽然文章没写,但 MoEx 其实也有区域交换)
  • MoEx 提出了对标签进行混合,这点 CNSN 没有,因为 MoEx 基于的 PONO 是形状信息而 CNSN 是风格的迁移

结果复现

1
python train_moex.py --net_type pyramidnet_moex --dataset cifar100 --depth 200 --alpha 240 --batch_size 64 --lr 0.25 --expname pyramidnet_moex --epochs 300 --beta 1.0 --lam 0.5 --moex_prob 0.25

结果为:

1
Current best accuracy (top-1 and 5 error): 15.5 3.16

References


如果对你有帮助的话,请给我点个赞吧~

欢迎前往 我的博客 查看更多笔记

--- ♥ end ♥ ---

欢迎关注我呀~