ChannelNets: 省力又讨好的channel-wise卷积,在channel维度进行卷积滑动 | NeurIPS 2018

Channel-wise卷积在channel维度上进行滑动,巧妙地解决卷积操作中输入输出的复杂全连接特性,但又不会像分组卷积那样死板,是个很不错的想法

来源:晓飞的算法工程笔记 公众号

论文: ChannelNets: Compact and Efficient Convolutional Neural Networks via Channel-Wise Convolutions

Introduction


  深度可分离卷积能够减少网络的计算量和参数量,其中point-wise卷积占据了大部分参数量,论文认为网络轻量化的下一个核心在于改变输入到输出的稠密连接方式。为此,论文提出channel-wise卷积的概念,将输入输出的维度连接进行稀疏化而非全连接,区别于分组卷积的严格分组,让卷积在channel维度上进行滑动,能够更好地保留channel间的信息交流。基于channel-wise卷积的思想,论文进一步提出了channel-wise深度可分离卷积,并基于该结构替换网络最后的全连接层+全局池化的操作,搭建了ChannelNets。

Channel-Wise Convolutions and ChannelNets


  图a为深度可分离卷积结构,而图b为加入分组后的深度可分离卷积的结构,其中每个点代表一维特征。

Channel-Wise Convolutions

  Channel-wise卷积的核心在于输入和输出连接的稀疏化,每个输出仅与部分输入相连,概念上区别于分组卷积,没有对输入进行严格的区分,而是以一定的stride去采样多个相关输入进行输出(在channel维度滑动),能够降少参数量以及保证channel间一定程度的信息流。假设卷积核大小为 d k d_k dk,输出大小维度为 n n n,输入特征图大小为 d f × d f d_f\times d_f df×df,普通卷积的参数量为 m × d k × d k × n m\times d_k\times d_k\times n m×dk×dk×n,计算量为 m × d k × d k × d f × d f × d f × n m\times d_k\times d_k\times d_f\times d_f\times d_f\times n m×dk×dk×df×df×df×n,而channel-wise卷积的参数量为 d c × d k × d k d_c\times d_k\times d_k dc×dk×dk d c d_c dc一般为远小于 m m m的数,代表一次采样的输入维度,计算量为 d c × d k × d k × d f × d f × n d_c\times d_k\times d_k\times d_f\times d_f\times n dc×dk×dk×df×df×n,参数量和计算量都脱离于输入特征的维度 m m m

Group Channel-Wise Convolutions

  分组卷积的分组思想会导致channel间的信息阻隔,为了增加分组间的channel信息交流,一般需要在后面添加一个融合层,继续保持分组的同时整合所有组的特征。论文使用分组channel-wise卷积层作为融合层,包含 g g g个channel-wise卷积。定义输入特征维度 n n n,分组数 g g g,每个channel-wise卷积的stride为 g g g(这里指channel上滑动的步幅),输出 n / g n/g n/g特征图(滑动 n / g n/g n/g次)。为了保证每个分组的输出涵盖了所有的输入,需要满足 d c ≥ g d_c \ge g dcg,最后将所有的输出concate起来,结构如图c所示。

Depth-Wise Separable Channel-Wise Convolutions

  深度可分离channel-wise卷积在深度卷积后面接一个channel-wise卷积用以融合特征来降低参数量和计算量,结构如图d所示。图中的channel-wise卷积的stride为1, d c d_c dc为3,在进行特征融合的同时能够降低参数量。

Convolutional Classification Layer

  一般网络最后都使用全局池化和全连接层进行最后的分类,但是这样的组合的参数量十分巨大。全局池化+全连接层的组合实际可以转换成深度可分离卷积,使用固定权重的深度卷积代替全局池化,pointwise卷积代替全连接层。因此,可以进一步使用上述的深度可分离channel-wise卷积来进行优化,而这里由于池化和全连接之间没有使用激活函数或BN等操作,采用常规的三维卷积进行实现更高效。

  假设输入特征图为 m × d f × d f m\times d_f\times d_f m×df×df,类别数为 n n n,深度卷积或全局池化可以认为是卷积核大小为 d f × d f × 1 d_f\times d_f\times 1 df×df×1,权重固定为 1 / d f 2 1/d^2_f 1/df2的三维卷积,而channel-wise可认为是卷积核大小为 1 × 1 × d c 1\times 1\times d_c 1×1×dc的三维卷积,两者可以合并成一个卷积核大小为 d f × d f × d c d_f\times d_f\times d_c df×df×dc的三维卷积。为了符合类别数量, d c = m − n + 1 d_c=m-n+1 dc=mn+1,即每个类别的预测仅需要使用 ( m − n + 1 ) (m-n+1) (mn+1)个输入特征图。

  论文可视化了全连接分类层的权重,蓝色是代表为0或接近0的权重,可以看到全连接分类层的权重实际非常稀疏,即本身也只使用到部分输入,所以这里使用部分输入特征也是合理的。

ChannelNets

  ChannelNet根据MobileNet的基础结构进行构建,设计了图3的分组模块(GM)和分组channel-wise模块(GCWM)。由于GM模块存在信息阻隔的问题,所以在GM模块前面使用GCWM来生成包含全局信息的分组特征。

  ChannelNet包含3个版本:

  • ChannelNet-v1替换了部分深度可分离卷积为GM和GCWM,分组数为2,共包含约370万参数。
  • ChannelNet-v2替换最后的深度可分离卷积为深度可分离channel-wise卷积,大约节省100万参数,占ChannelNet-v1的25%参数。
  • ChannelNet-v3替换最后的池化层加全连接层为上述的Convolutional Classification Layer,大约节省了100万(1024x1000-7x7x25)参数。

Experimental Studies


  在ILSVRC 2012进行网络性能对比。

  对比更轻量的网络性能,这里采用MobileNet的width multiplier思想缩放每层的维度。

  对比分组channel-wise卷积对ChannelNet的影响,替换GCWM为GM模块,考虑GCWM模块仅增加了32个参数,这样的性能提升是高效的。

Conclustion


  Channel-wise卷积在channel维度上进行滑动,巧妙地解决卷积操作中输入输出的复杂全连接特性,但又不会像分组卷积那样死板,是个很不错的想法。但感觉论文本身的性能还不够最优,论文对比的也只是MobileNetV1,跟MobileNetV2比差了点。



如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】

work-life balance.

<think>好的,用户想了解Dense U-Net的相关信息,包括架构、实现方式和应用场景。首先,我需要回忆一下U-Net的变体,比如UNet++、3D U-Net,以及Dense U-Net的结构。根据用户提供的引用,UNet++是嵌套的U-Net结构,而Dense U-Net可能结合了DenseNet的思想,比如密集连接块。 首先,我应该明确Dense U-Net的基本架构。传统的U-Net有编码器和解码器,带有跳跃连接。Dense U-Net可能在每个编码和解码块中使用密集连接,这样可以增强特征传播,提高梯度流动,类似于DenseNet的结构。我需要确认这一点是否正确,并找到相关文献支持。 接下来是实现方式。用户可能需要代码示例,比如用PyTorch实现。需要构建密集块,可能包括多个卷积层,每个层的输入是前面所有层的输出拼接。同时,跳跃连接部分可能需要调整,以适应密集块的结构。需要确保代码符合用户的要求,使用正确的框架,并注意上下采样和特征融合的方式。 然后是应用场景。Dense U-Net在医学图像分割中可能表现更好,因为密集连接可以捕捉多尺度特征。结合用户提到的引用[1]和[2],UNet++和3D U-Net都用于医学图像,所以Dense U-Net可能也适用于类似领域,如CT、MRI分割或细胞显微图像分析。需要指出这些应用场景,并引用相关文献。 还需要考虑用户可能的深层需求。比如,他们可能在比较不同U-Net变体的优劣,或者寻找适合自己项目的模型结构。因此,除了基本架构外,可能需要解释Dense U-Net的优势,如参数效率、特征重用、减少过拟合等。 另外,用户的问题中提到了生成相关问题,需要准备相关的问题,比如Dense U-Net与UNet++的区别,实现中的挑战,优化方法等。确保问题有针对性,帮助用户进一步探索。 最后,检查回答是否符合格式要求:数学公式用$...$,独立公式用$$...$$,正确的中文回答,引用标记。确保代码示例正确,语法无误,并符合PEP8标准。</think>### Dense U-Net架构解析 Dense U-Net是基于U-Net和DenseNet思想结合的改进模型,核心是通过密集连接(Densely Connected Blocks)增强特征复用与梯度流动,提升医学图像分割的精度[^1]。其架构主要分为以下部分: 1. **编码器(下采样路径)** - 每个阶段包含一个密集连接块,每个块内多层卷积操作,且每层的输入是前面所有层输出的拼接(Channel-wise Concatenation)。 - 密集块结构示例: $$x_l = H_l([x_0, x_1, ..., x_{l-1}])$$ 其中$H_l$表示第$l$层的非线性变换,$[·]$表示拼接操作。 2. **解码器(上采样路径)** - 每个解码阶段通过转置卷积(Transposed Convolution)上采样,并与对应编码器的特征图拼接。 - 跳跃连接(Skip Connections)改进为密集跳跃连接,融合多尺度特征。 3. **瓶颈层(Bottleneck)** - 在编码器和解码器之间引入密集块,进一步提取深层语义信息。 ### 实现方式(PyTorch示例) ```python import torch import torch.nn as nn class DenseBlock(nn.Module): def __init__(self, in_channels, growth_rate=16, num_layers=4): super().__init__() self.layers = nn.ModuleList([ nn.Sequential( nn.Conv2d(in_channels + i * growth_rate, growth_rate, 3, padding=1), nn.BatchNorm2d(growth_rate), nn.ReLU() ) for i in range(num_layers) ]) def forward(self, x): features = [x] for layer in self.layers: new_feature = layer(torch.cat(features, dim=1)) features.append(new_feature) return torch.cat(features, dim=1) class DenseUNet(nn.Module): def __init__(self, in_channels=1, out_channels=2): super().__init__() # 编码器部分(示例) self.encoder1 = DenseBlock(in_channels) self.down1 = nn.Conv2d(64, 128, kernel_size=2, stride=2) # 假设DenseBlock输出通道为64 # 解码器部分(示例) self.up1 = nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2) self.decoder1 = DenseBlock(128) # 输入为跳跃连接特征+上采样特征 def forward(self, x): # 编码器路径 x1 = self.encoder1(x) x2 = self.down1(x1) # 解码器路径 x_up = self.up1(x2) x_cat = torch.cat([x_up, x1], dim=1) x_out = self.decoder1(x_cat) return x_out ``` ### 应用场景 1. **医学图像分割** - 如MRI脑区分割、CT肺部病灶检测,密集连接可有效捕捉细微结构[^2]。 2. **细胞显微图像分析** - 密集特征复用有助于处理细胞边界模糊的问题。 3. **3D体积数据分割** - 扩展为3D Dense U-Net,适用于立体医学影像(如肿瘤分割)。 ### 核心优势 - **特征复用**:密集连接减少冗余计算,提升参数效率。 - **梯度流动**:跨层连接缓解梯度消失问题。 - **鲁棒性增强**:多尺度特征融合提升小目标分割精度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值