IBN-Net ResNetIBN的原理以及DSBN的代码

IBN-Net

IBN-Net由《Two at Once: Enhancing Learning and Generalization Capacities via IBN-Net》这篇文章提出。
归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2018年);
将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在
在这里插入图片描述

batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
instanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
GroupNorm将channel分组,然后再做归一化;
SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
根据BN和IN的定义, BN是增加样本间的差异,IN是提高对亮度,色调变化的鲁棒性。
在这里插入图片描述
这个作者用resnet50,分别在两对样本集上训练,横坐标是层的索引,纵坐标是特征差异(论文最后有对特征差异的定义,高斯+KL散度)。
蓝色柱状图是resnet50在Imagenet和其对应的monet版本,二者最大的差异是颜色,亮度等风格类特征,能够看到它的浅层特征差异大,深层特征差异小;
橘色柱状图是两个类别不同集合上训练的对比结果,集合的内容差异很大,结果两个模型浅层特征差异小,深层特征差异大。
所以只有BN的resnet50网络,浅层特征和风格有关,深层和内容有关。
而IN能够提高特征对风格类特征的鲁棒性,所以对此论文中提出的两个准则:

  1. IN只添加到浅层网络,不添加到深层网络。
    因为IN提取的特征降低了样本间差异,不能放在深层影响分类效果
  2. 浅层BN层也要保留,保证内容相关信息可以顺利被传入深层
    IBN-Net提高迁移能力是因为保持内容特征的同时,降低特征对风格类特征的鲁棒性。
    所以它常常被用于无监督域适应当中。

DSBN

可用于无监督中的域适应UDA方法中,其实就是把输入的数据分成源域和目标域分别输入到不同的BN层。

class DSBN2d(nn.Module):
    def __init__(self, planes):
        super(DSBN2d, self).__init__()
        self.num_features = planes
        self.BN_S = nn.BatchNorm2d(planes)
        self.BN_T = nn.BatchNorm2d(planes)

    def forward(self, x):
        if (not self.training):
            return self.BN_T(x)

        bs = x.size(0)#bchw
        assert (bs%2==0)
        split = torch.split(x, int(bs/2), 0)#把batchsize分成两半,一半源域,一半目标域
        out1 = self.BN_S(split[0].contiguous())
        out2 = self.BN_T(split[1].contiguous())
        out = torch.cat((out1, out2), 0)
        return out
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值