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版本,二者最大的差异是颜色

IBN-Net(Instance Normalization and Batch Normalization Network)是一种结合了实例归一化(Instance Normalization, IN)和批归一化(Batch Normalization, BN)的深度学习模型架构,旨在提升网络在不同任务和域适应场景下的表现。该模型最初被提出用于解决图像风格迁移与内容保持之间的平衡问题,其核心思想是在网络的不同层次中混合使用IN和BN操作,以同时获得风格迁移能力和内容识别的稳定性。 IBN-Net的基本结构可以基于多种骨干网络进行构建,例如ResNet、ResNeXt等。以ResNet为例,IBN-Net的改进主要体现在其残差块的设计上。在标准的ResNet残差块中,仅使用BN进行归一化。而在IBN-Net中,部分BN层被替换为IN层,通常是在浅层使用IN以适应风格变化,而在深层保留BN以增强内容识别能力[^2]。 ### IBN-Net架构的关键特点 1. **混合归一化策略**:IBN-Net的核心特性是在不同层次使用IN和BN的组合。这种策略能够同时保留图像的风格信息和内容信息,从而在域适应任务中表现出色。 2. **模块化设计**:IBN-Net通常基于现有的网络架构(如ResNet)进行改造,通过在特定的残差块中插入IN层来实现。这种设计使得IBN-Net可以灵活地应用于不同的任务。 3. **增强的域适应能力**:由于IN能够去除图像的全局统计信息(如均值和方差),而BN保留了这些信息,因此IBN-Net在跨域任务(如从合成数据到真实数据的迁移)中表现出更强的适应性。 以下是一个基于ResNet-50的IBN-Net残差块设计示例: ```python class IBN_Bottleneck(nn.Module): expansion = 4 def __init__(self, inplanes, planes, ibn=None, stride=1, downsample=None): super(IBN_Bottleneck, self).__init__() self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) if ibn == 'a': self.bn1 = IBN(planes) else: self.bn1 = nn.BatchNorm2d(planes) self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(planes) self.conv3 = nn.Conv2d(planes, planes * self.expansion, kernel_size=1, bias=False) self.bn3 = nn.BatchNorm2d(planes * self.expansion) self.relu = nn.ReLU(inplace=True) self.downsample = downsample self.stride = stride def forward(self, x): residual = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) out = self.relu(out) out = self.conv3(out) out = self.bn3(out) if self.downsample is not None: residual = self.downsample(x) out += residual out = self.relu(out) return out ``` 在上述代码中,`IBN`是一个自定义的混合归一化层,根据参数`ibn`的选择,可以选择使用IN或BN。这种设计允许在不同的网络层中灵活切换归一化方式,从而实现IBN-Net的核心思想。 ### IBN-Net的应用场景 IBN-Net广泛应用于需要域适应能力的任务,例如: - **图像风格迁移**:通过IN去除图像的全局统计信息,保留局部特征,从而实现风格的迁移。 - **跨域图像识别**:在目标域数据分布与源域差异较大的情况下,IBN-Net能够通过IN和BN的结合提高模型的泛化能力。 - **医学图像分析**:在医学图像领域,由于不同设备或采集条件的影响,图像的统计特性可能差异较大,IBN-Net能够有效适应这种变化。 ### IBN-Net的可视化展示 虽然具体的IBN-Net结构图或架构示意图无法直接提供,但可以通过以下方式构建其可视化表示: 1. **网络结构图**:使用工具如Netron或TensorBoard,可以将IBN-Net的模型结构导出为可视化图,展示各层的连接关系。 2. **特征图可视化**:通过Grad-CAM等技术,可以可视化IBN-Net在不同层的特征响应,帮助理解其在风格和内容上的处理机制。 3. **归一化层分布图**:绘制IN和BN在不同层中的分布情况,分析其对网络性能的影响。 通过上述方法,可以更直观地理解IBN-Net的架构设计及其在实际任务中的表现。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值