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能够提高特征对风格类特征的鲁棒性,所以对此论文中提出的两个准则:
- IN只添加到浅层网络,不添加到深层网络。
因为IN提取的特征降低了样本间差异,不能放在深层影响分类效果 - 浅层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