lenet 到 densenet 总结 一

本文深入探讨了LeNet、AlexNet、Vgg、GoogleNet、Resnet、DenseNet等经典深度学习模型的架构特点与创新之处,分析了不同模型在卷积层、全连接层及特殊层的设计理念,揭示了深度学习网络从浅到深的发展历程。
部署运行你感兴趣的模型镜像

LeNet:

ç½ç»è§£æï¼ä¸ï¼ï¼LeNet-5详解

  • 输入尺寸:32*32
  • 卷积层:3个
  • 降采样层:2个
  • 全连接层:1个
  • 输出层:10个类别(数字0-9的概率)

AlexNet:

 

1. 非线性激活函数:ReLU

2. 防止过拟合的方法:Dropout,Data augmentation

3. 大数据训练:百万级ImageNet图像数据

4. 其他:GPU实现,LRN归一化层的使用

Vgg:

VGGNet探索了神经网络的深度与性能之间的关系,表明在结构相似的情况下,网络越深性能越好。 

* 卷积核* 
该模型中大量使用3*3的卷积核的串联,构造出16到19层的网络。

2个3*3的卷积核的串联相当于5*5的卷积核。 
3个3*3的卷积核的串联相当于7*7的卷积核。

其意义在于7*7所需要的参数为49,3个3*3的卷积核参数为27个,几乎减少了一半。

GoogleNet:

主要的创新在于他的Inception,这是一种网中网(Network In Network)的结构,即原来的结点也是一个网络。Inception一直在不断发展,目前已经V2、V3、V4了,感兴趣的同学可以查阅相关资料。Inception的结构如图9所示,其中1*1卷积主要用来降维,用了Inception之后整个网络结构的宽度和深度都可扩大,能够带来2-3倍的性能提升。

1. 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合; 

2. 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1后,只要分别设定pad=0、1、2,那么卷积后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了; 

3 . 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了;

4 . 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。

5. 使用5x5的卷积核仍然会带来巨大的计算量。 为此,文章借鉴NIN2,采用1x1卷积核来进行降维。 例如:假定上一层的输出为100x100x128,经过具有256个5x5卷积核的卷积层处理之后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个1x1卷积核的卷积层,再经过具有256个5x5卷积核的卷积层,那么最终的输出数据仍为为100x100x256,但卷积层参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。

此外,该模型最后采用了average pooling来代替全连接层。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune。
 

Resnet:  其实这个model构成上更加简单,连LRN这样的layer都没有了。

20160907100309_40

 实际中,考虑计算的成本,对残差块做了计算优化:将两个3x3的卷积层替换为1x1 + 3x3 + 1x1, 如下图所示:

                                                          20160907100309_801

DenseNet:

(1) 相比ResNet拥有更少的参数数量.

(2) 旁路加强了特征的重用.

(3) 网络更易于训练,并具有一定的正则效果.

(4) 缓解了gradient vanishing和model degradation的问题.

下图是 DenseNet 的一个dense block示意图,一个block里面的结构如下,与ResNet中的BottleNeck基本一致:BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3) ,而一个DenseNet则由多个这种block组成。每个DenseBlock的之间层称为transition layers,由BN−>Conv(1×1)−>averagePooling(2×2)组成

何恺明先生在提出ResNet时做出了这样的假设:若某一较深的网络多出另一较浅网络的若干层有能力学习到恒等映射,那么这一较深网络训练得到的模型性能一定不会弱于该浅层网络.通俗的说就是如果对某一网络中增添一些可以学到恒等映射的层组成新的网路,那么最差的结果也是新网络中的这些层在训练后成为恒等映射而不会影响原网络的性能.同样DenseNet在提出时也做过假设:与其多次学习冗余的特征,特征复用是一种更好的特征提取方式.

它的输出为:xl=Hl([X0,X1,…,xl−1]),其中[x0,x1,...,xl−1]就是将之前的feature map以通道的维度进行合并。

在同层深度下获得更好的收敛率,自然是有额外代价的。其代价之一,就是其恐怖如斯的内存占用。

在Denseblock中,假设每一个非线性变换H的输出为K个feature map, 那么第i层网络的输入便为K0+(i-1)×K。虽然DenseNet接受较少的k,也就是feature map的数量作为输出,但由于不同层feature map之间由cat操作组合在一起,最终仍然会是feature map的channel较大而成为网络的负担.作者在这里使用1×1 Conv(Bottleneck)作为特征降维的方法来降低channel数量,以提高计算效率. 无论多大的num_input_features  输出都会变为growth_rate(k)

BN+ReLU+1x1 Conv+BN+ReLU+3x3 Conv

# DenseBlock
        num_features = num_init_features
        for i, num_layers in enumerate(block_config):
            block = _DenseBlock(num_layers, num_features, bn_size, growth_rate, drop_rate)
            self.features.add_module("denseblock%d" % (i + 1), block)
            num_features += num_layers*growth_rate
            if i != len(block_config) - 1:
                transition = _Transition(num_features, int(num_features*compression_rate))
                self.features.add_module("transition%d" % (i + 1), transition)
                num_features = int(num_features * compression_rate)
class _DenseLayer(nn.Sequential):
    """Basic unit of DenseBlock (using bottleneck layer) """
    def __init__(self, num_input_features, growth_rate, bn_size, drop_rate):
        super(_DenseLayer, self).__init__()
        self.add_module("norm1", nn.BatchNorm2d(num_input_features))
        self.add_module("relu1", nn.ReLU(inplace=True))
        self.add_module("conv1", nn.Conv2d(num_input_features, bn_size*growth_rate,
                                           kernel_size=1, stride=1, bias=False))
        self.add_module("norm2", nn.BatchNorm2d(bn_size*growth_rate))
        self.add_module("relu2", nn.ReLU(inplace=True))
        self.add_module("conv2", nn.Conv2d(bn_size*growth_rate, growth_rate,
                                           kernel_size=3, stride=1, padding=1, bias=False))
        self.drop_rate = drop_rate

    def forward(self, x):
        new_features = super(_DenseLayer, self).forward(x)
        if self.drop_rate > 0:
            new_features = F.dropout(new_features, p=self.drop_rate, training=self.training)
        return torch.cat([x, new_features], 1)

我们实现Transition层,它主要是一个卷积层和一个池化层:

class _Transition(nn.Sequential):
    """Transition layer between two adjacent DenseBlock"""
    def __init__(self, num_input_feature, num_output_features):
        super(_Transition, self).__init__()
        self.add_module("norm", nn.BatchNorm2d(num_input_feature))
        self.add_module("relu", nn.ReLU(inplace=True))
        self.add_module("conv", nn.Conv2d(num_input_feature, num_output_features,
                                          kernel_size=1, stride=1, bias=False))
        self.add_module("pool", nn.AvgPool2d(2, stride=2))

 

 

您可能感兴趣的与本文相关的镜像

Wan2.2-I2V-A14B

Wan2.2-I2V-A14B

图生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

<think>嗯,用户这次的问题是关于ResNet、EfficientNet和DenseNet是否属于目标检测模型的确认。结合用户提供的引用资料和之前的对话历史,需要明确区分基础网络架构与完整检测模型的概念。 用户之前已经了解RetinaNet是目标检测模型,现在转向询问这些经典网络的性质。从引用[2]和[3]可以看出,LeNet5、GoogleNet等都是图像分类网络,而引用[3]明确提到这些网络可作为组件使用。特别注意到引用[2]中"目标检测则不仅需要回答图像中有什么,而且还得给出这些物体在图像中位置问题"的论述,这正好说明完整的检测模型需要包含定位功能。 用户可能混淆了骨干网络(backbone)和完整检测模型的概念。需要强调:这些网络本身是特征提取器,就像汽车的发动机不能等同于整车。例如引用[4]显示ResNet用于水果分类,这正是其原始设计用途的典型例证。 在解释时要特别注意三点:是明确分类网络与检测模型的本质区别(有无定位能力);二是说明这些网络如何被检测模型复用;三是举例要贴近用户提供的引用内容。最后生成的对比表格需要突出核心差异点,帮助用户建立系统认知。</think>ResNet、EfficientNet 和 DenseNet **本身不是目标检测模型**,而是**用于目标检测模型的骨干网络(Backbone)**。以下是关键说明: --- ### 1. **核心定位:特征提取器** - **本质功能**:这些网络是**卷积神经网络(CNN)**,专为**图像分类任务**设计,核心作用是提取图像的层次化特征[^2][^3]。 - **目标检测中的应用**: - 作为目标检测模型的**基础特征提取模块**(如 RetinaNet、Faster R-CNN 等),替代早期的手工特征[^3]。 - 例如:RetinaNet = **ResNet/ResNeXt + FPN + 检测头**;YOLO 系列常采用 **EfficientNet 或 CSPDarknet** 作为骨干网络。 --- ### 2. **与目标检测模型的区别** | **网络类型** | 功能 | 典型代表 | 是否直接输出检测结果 | |--------------------|--------------------------|------------------------------|----------------------| | **骨干网络** | 特征提取 | ResNet, EfficientNet, DenseNet | ❌ 否 | | **目标检测模型** | 特征提取 + 定位 + 分类 | RetinaNet, YOLO, SSD | ✅ 是 | --- ### 3. **具体网络解析** - **ResNet**: - 通过**残差连接**解决深层网络梯度消失问题,提升特征表达能力[^3]。 - 目标检测应用:Faster R-CNN、Mask R-CNN 的默认骨干网络。 - **EfficientNet**: - 通过**复合缩放**(同时调整深度/宽度/分辨率)平衡精度与计算量[^2]。 - 目标检测应用:EfficientDet 的核心组件。 - **DenseNet**: - 采用**密集连接**(每层接收前面所有层的输入),增强特征复用[^3]。 - 目标检测应用:用于 SSD 的改进版本 DSOD。 --- ### 4. **目标检测模型的完整架构** 个典型目标检测模型包含三部分: $$ \text{目标检测模型} = \underbrace{\text{骨干网络}}_{\text{ResNet/EfficientNet/...}} + \underbrace{\text{特征融合模块}}_{\text{FPN, PANet}} + \underbrace{\text{检测头}}_{\text{分类+回归}} $$ 骨干网络仅负责初级特征提取,后续模块需完成**目标定位与分类**[^2]。 --- ### 总结 - **ResNet、EfficientNet、DenseNet 是特征提取网络**,用于图像分类或作为目标检测模型的组件[^2][^3]。 - **目标检测模型需额外添加定位和分类模块**(如锚框机制、边界框回归)才能输出检测结果[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值