残差网络的发展路Resnet+ResNext+Densenet+DPN

ResNet

ResNet是著名的神经网络,网络中的残差块更是广为人知,如下图,残差块的公式为 y = F ( x ) + x y=F(x)+x y=F(x)+x x x x为输入, F ( x ) F(x) F(x)代表的则是卷积操作。
在这里插入图片描述

网络图

残差块两种主要模块如下图:左边的是浅层Resnet架构,右边的深层Resnet架构, 1 ∗ 1 1*1 11卷积层负责先降维和升维(考虑到训练时间),这样 3 ∗ 3 3*3 33卷积层的输入和输出可以在一个比较小的维度。下图中,左边输入64维,右边输入256维,但是这两种设计具有相似的时间复杂度。
在这里插入图片描述

代码

def resnet_basicblock(l, ch_out, stride):
    shortcut = l
    l = Conv2D('conv1', l, ch_out, 3, strides=stride, activation=BNReLU)
    l = Conv2D('conv2', l, ch_out, 3, activation=get_bn(zero_init=True))
    out = l + resnet_shortcut(shortcut, ch_out, stride, activation=get_bn(zero_init=False))
    return tf.nn.relu(out)
def resnet_bottleneck(l, ch_out, stride, stride_first=False):
    shortcut = l
    l = Conv2D('conv1', l, ch_out, 1, strides=stride if stride_first else 1, activation=BNReLU)
    l = Conv2D('conv2', l, ch_out, 3, strides=1 if stride_first else stride, activation=BNReLU)
    l = Conv2D('conv3', l, ch_out * 4, 1, activation=get_bn(zero_init=True))
    out = l + resnet_shortcut(shortcut, ch_out * 4, stride, activation=get_bn(zero_init=False))
    return tf.nn.relu(out)

下表是ImageNet的架构,表格中,方括号就是上图类似的块,以及块的数量。
在这里插入图片描述

实验结果

ImageNet-1K验证集的Top-1错误率。
在这里插入图片描述
该网络在2015年ILSVRC比赛中获得了第一名,有比较好的实用意义。

ResNeXt

ResNeXt是ResNet网络的一个变种,是通过重复一个块构建的,该构建块聚集了一组具有相同拓扑结构的转换,简称聚合转换。
T i ( x ) T_i(x) Ti(x)与一个简单的神经元相似。
在这里插入图片描述
y是输出。
在这里插入图片描述

网络图

在这里插入图片描述

实验结果

ImageNet-1K数据集,Top-1错误率结果。
在这里插入图片描述

参数量对比图

在这里插入图片描述

在这里插入图片描述

总结

该网络使用一种分组卷积的思想,与Resnet网络相结合。该网络在ILSVRC 2016比赛中获得了第二名。

代码

class ResNeXtBottleneck(nn.Module):
    def __init__(self, in_channels, out_channels, stride, cardinality, base_width, widen_factor):
    """ Constructor
        Args:
            in_channels: input channel dimensionality
            out_channels: output channel dimensionality
            stride: conv stride. Replaces pooling layer.
            cardinality: num of convolution groups.
            base_width: base number of channels in each group.
            widen_factor: factor to reduce the input dimensionality before convolution.
        """
        super(ResNeXtBottleneck, self).__init__()
        width_ratio = out_channels / (widen_factor * 64.)
        D = cardinality * int(base_width * width_ratio)
        self.conv_reduce = nn.Conv2d(in_channels, D, kernel_size=1, stride=1, padding=0, bias=False)
        self.bn_reduce = nn.BatchNorm2d(D)
        self.conv_conv = nn.Conv2d(D, D, kernel_size=3, stride=stride, padding=1, groups=cardinality, bias=False)
        self.bn = nn.BatchNorm2d(D)
        self.conv_expand = nn.Conv2d(D, out_channels, kernel_size=1, stride=1, padding=0, bias=False)
        self.bn_expand = nn.BatchNorm2d(out_channels)

        self.shortcut = nn.Sequential()
        if in_channels != out_channels:
            self.shortcut.add_module('shortcut_conv',
                                     nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, padding=0,
                                               bias=False))
            self.shortcut.add_module('shortcut_bn', nn.BatchNorm2d(out_channels))

    def forward(self, x):
        bottleneck = self.conv_reduce.forward(x)
        bottleneck = F.relu(self.bn_reduce.forward(bottleneck), inplace=True)
        bottleneck = self.conv_conv.forward(bottleneck)
        bottleneck = F.relu(self.bn.forward(bottleneck), inplace=True)
        bottleneck = self.conv_expand.forward(bottleneck)
        bottleneck = self.bn_expand.forward(bottleneck)
        residual = self.shortcut.forward(x)
        return F.relu(residual + bottleneck, inplace=True)

在这里插入图片描述

DenseNet

上面说过,ResNet相当于添加了一个跳跃链接,通过恒等函数绕过非线性变换。
x l = F l ( x l − 1 ) + x l

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ResNet和SE(Squeeze-and-Excitation)是深度学习中常用的两种网络结构。 ResNet是一种残差网络,旨在解决训练深度网络时出现的梯度消失和梯度爆炸问题。其主要特点是引入了跨层的连接(shortcut connection),通过跨层连接使得网络可以直接传递前一层的特征,从而使得网络可以更加容易地学习到残差(residual)。ResNet被广泛应用于图像识别、目标检测等计算机视觉任务中,其在ILSVRC 2015比赛中取得了显著的成绩,成为深度学习领域的经典网络结构之一。 而SE网络是一种注意力机制的网络结构,旨在提升网络对于特定特征的关注程度。通过引入Squeeze和Excitation两个操作,SE网络能够自适应地调整特征图的通道权重,从而强化重要特征的表示。具体来说,Squeeze操作通过全局平均池化将每个通道的特征图转化为一个标量,然后通过全连接层将该标量映射为一个权重向量,最后通过Excitation操作利用这个权重向量来调整原始特征图。SE网络可以用于各种任务,例如图像分类、目标检测和图像分割等,能够显著提升网络的性能。 综上所述,ResNet是一种用于解决深度网络训练中梯度问题的残差网络结构,而SE网络则是一种引入注意力机制的网络结构,能够自适应地增强重要特征的表示。这两种网络结构在计算机视觉任务中具有重要的应用价值,为提升网络性能和提高特征表示能力做出了重要贡献。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值