深度学习小白——DenseNet学习

2023-11-19

原论文地址:https://arxiv.org/abs/1608.06993

用Keras写的pre-model代码地址:https://github.com/flyyufelix/DenseNet-Keras


一、主要原理

其借鉴了ResNet的思想,用dense connectivity的方式更加缩短了头尾之间层的连接,使得

在前向传播过程中,每一层都与其他所有层相连

于是一个有L层的DenseNet就有L(L+1)/2个连接,每一层都将之前所有层输出的feature map 连结起来作为自己的输入,然后再把自己的输出输送给之后的所有层


这个网络的优点如下:

1.减轻了梯度弥散的问题,使模型不容易过拟合

2.增强了特征在各个层之间的流动,因为每一层都与初始输入层还有最后的由loss function得到的梯度直接相连

3.大大减少了参数个数,提高训练效率



【与ResNet比较】

ResNet是引入了一个skip-connection使得每一层的输出为经过非线性变化的结果加上恒等于输入的函数


而DenseNet为了更加提高信息在层与层之间的流动,它将每一层都与之后的每一层相连 

H括号里的就是0到 l-1层的所有feature maps的连结,这里的H是指BN+ReLU+3*3卷积的组合(同ResNet)


【几个特殊的地方】

1.Transition layers


由于在dense block中每经过一个conv_block,就要增加growth_rate个feature map,所以需要在一个dense block后加入transition layers来压缩一定数量的feature maps,保证训练的高效性。


2.在一个dense block里,每个conv_block的输出会与输入接在一起传递给下一个Conv block,以此类推,使得每个conv_block都彼此相连,且把feature map都连结起来,而不是加起来



【代码的研读】

这里是训练ImageNet用的121层的网络结构,各个层配置如下:


from keras.models import Model
from keras.layers import Input, merge, ZeroPadding2D
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.convolutional import Convolution2D
from keras.layers.pooling import AveragePooling2D, GlobalAveragePooling2D, MaxPooling2D
from keras.layers.normalization import BatchNormalization
import keras.backend as K

from custom_layers import Scale

def DenseNet(nb_dense_block=4, growth_rate=32, nb_filter=64, reduction=0.0, dropout_rate=0.0, weight_decay=1e-4, classes=1000, weights_path=None):
    '''Instantiate the DenseNet 121 architecture,
        # Arguments
            nb_dense_block: number of dense blocks to add to end
            growth_rate: number of filters to add per dense block
            nb_filter: initial number of filters
            reduction: reduction factor of transition blocks. 1-theta
            dropout_rate: dropout rate
            weight_decay: weight decay factor
            classes: optional number of classes to classify images
            weights_path: path to pre-trained weights
        # Returns
            A Keras model instance.
    '''
    eps = 1.1e-5

    # compute compression factor
    compression = 1.0 - reduction

    # Handle Dimension Ordering for different backends
    global concat_axis
    if K.image_dim_ordering() == 'tf':
      concat_axis = 3# 通道数在第三维
      img_input = Input(shape=(224, 224, 3), name='data')
    else:
      concat_axis = 1
      img_input = Input(shape=(3, 224, 224), name='data')

    # From architecture for ImageNet (Table 1 in the paper)
    nb_filter = 64
    nb_layers = [6,12,24,16] # For DenseNet-121

    # Initial convolution
    x = ZeroPadding2D((3, 3), name='conv1_zeropadding')(img_input)
    x = Convolution2D(nb_filter, 7, 7, subsample=(2, 2), name='conv1', bias=False)(x)
    x = BatchNormalization(epsilon=eps, axis=concat_axis, name='conv1_bn')(x)
    x = Scale(axis=concat_axis, name='conv1_scale')(x)
    x = Activation('relu', name='relu1')(x) #(?,112,112,64)
    x = ZeroPadding2D((1, 1), name='pool1_zeropadding')(x)
    x = MaxPooling2D((3, 3), strides=(2, 2), name='pool1')(x)  #(?,56,56,64)

    # Add dense blocks
    for block_idx in range(nb_dense_block - 1):
        stage = block_idx+2
        x, nb_filter = dense_block(x, stage, nb_layers[block_idx], nb_filter, growth_rate, dropout_rate=dropout_rate, weight_decay=weight_decay)

        # Add transition_block
        x = transition_block(x, stage, nb_filter, compression=compression, dropout_rate=dropout_rate, weight_decay=weight_decay)
        nb_filter = int(nb_filter * compression)

    final_stage = stage + 1
    x, nb_filter = dense_block(x, final_stage, nb_layers[-1], nb_filter, growth_rate, dropout_rate=dropout_rate, weight_decay=weight_decay)

    x = BatchNormalization(epsilon=eps, axis=concat_axis, name='conv'+str(final_stage)+'_blk_bn')(x)
    x = Scale(axis=concat_axis, name='conv'+str(final_stage)+'_blk_scale')(x)
    x = Activation('relu', name='relu'+str(final_stage)+'_blk')(x)
    x = GlobalAveragePooling2D(name='pool'+str(final_stage))(x)

    x = Dense(classes, name='fc6')(x)
    x = Activation('softmax', name='prob')(x)

    model = Model(img_input, x, name='densenet')

    if weights_path is not None:
      model.load_weights(weights_path)

    return model


def conv_block(x, stage, branch, nb_filter, dropout_rate=None, weight_decay=1e-4):
    '''Apply BatchNorm, Relu, bottleneck 1x1 Conv2D, 3x3 Conv
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习小白——DenseNet学习 的相关文章

  • DeepSpeed配置参数 - 快速上手

    目录 DeepSpeed配置参数 快速上手 batch Size optimizer scheduler fp16 zero optimization csv monitor 例子 DeepSpeed配置参数 快速上手 DeepSpeed是
  • AI推荐的初级算法工程师学习路线

    学习算法是一项长期而且不断更新的工作 以下是一份初学者从入门到达到任职初级算法工程师要求的学习内容大纲 供您参考 1 编程语言 首先学习至少一门主流编程语言 如Python C Java等等 2 数据结构 学习数据结构是学习算法的基础 建议
  • CentOS 防火墙配置 80端口

    看了好几个页面内容都有错 下面是正确方法 sbin iptables I INPUT p tcp dport 80 j ACCEPT sbin iptables I INPUT p tcp dport 22 j ACCEPT 然后保存 et
  • 【STM32】标准库 串口下载以及STLINK

    STM32的串口下载 打开FlyMcu 接线就像之前那样接 USART1串口通信 必须是1 其他的不支持串口通信 编译之后就会生成HEX文件 而且上面的按钮Select也可以选择生成的位置 搜索串口 选择 然后波特率选择115200 在联机
  • 【tvm官网教程01】设计和架构-1

    tvm官网教程01 设计和架构 1 目的 1 编译流 1 1 关键数据结构 1 2 Transformations 1 2 1 变换的分类 1 2 2 relay transform 1 2 2 1 子函数 1 2 2 2 overall问
  • Consul服务注册与发现

    目录 一 Consul简介 一 官网 二 特点 二 安装并运行Consul 一 官网安装说明 二 下载 三 使用开发模式启动 三 服务提供者 四 服务消费者 五 三个注册中心异同点 一 CAP理论 二 AP架构 三 CP架构 一 Consu

随机推荐

  • 带有两个/三个未知数的算数-几何均值不等式的证明及其思路解析

    这是一篇学习手记 注 尽管文中大量使用了 一个显然的想法 自然而然 我们会想 等词语 我们也必须承认 这些伟大成果的证明需要天才的思路和不断的尝试 因此 第一次学习理解不了是很有可能的 比如我 基础 带有两个未知数的算数 几何均值不等式的证
  • MySQL同时In俩个字段,In多个字段,Mybatis多个In查询问题,Mysql多个IN查询多出数据问题,Mysql多个IN查询 数据准确问题

    背景 今天产品验收的时候 导入了大量数据 发现造价项目某个查询列表数据多出了几条数据 看了Mybatis查询 才发现是同时使用了多个IN查询导致的问题 入参是对象列表 In值是分开循环赋值的 问题就出在这里 需要根据两个字段去查询多个值 这
  • Barcode Reader Toolkit for Windows v8.3.3.3正式发布!

    Barcode Reader Toolkit for Windows 是一个工具包 允许开发人员在其应用程序中添加条形码检测 该工具包将图像文件或内存位图作为输入 并返回有关每个条形码的信息 包括值 类型和位置 所有主要的线性 1 D 条形
  • 1流明等于多少lux_要想投影仪画质清晰,投影仪流明和对比度不得不看

    在选购投影机的时候 大家都会根据预算 尽可能选择画质清晰的投影机 一般来说会根据使用场景的不同 从XGA到1080P甚至4K的分辨率 那么 投影机的画质清晰效果只和分辨率有关么 其实不是 一款画质效果好的投影机 和投影机的流明和对比度也是息
  • Vue—实现动画、过度效果

    动画效果
  • UnityLuaMvvM Lua 带通知的Mode类

    实现数据更新UI自动刷新的核心代码 欢迎关注https gitee com xiongks UnityMVVM mode function modeType local obj obj modeType modeType obj filds
  • extends OverWrite

    extends 扩展延伸 继承 用这个方法对class有了进一步的汇总 减少了对具有相同属性的类重复enter的工作量 使函数模块化更高 注 构造函数内的属性和方法能继承 package Extends 定义一个父类public class
  • 远程桌面连接技术【包含出现问题的解决手段】

    远程桌面连接技术 文章目录 远程桌面连接技术 前言 定义 远程连接的方法 远程桌面协议 RDP 由于我没有两台电脑 这里用虚拟机演示 1 为两台计算机设置相同的网段的 IP 地址 2 远程计算机的设置 2 1 在电脑中找到 远程桌面连接 2
  • 【单片机】keil和Proteus使用教程

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 kei
  • I/O流之进步认识、InputStream以及FileInputStream

    File类 用于描述一个文件或者文件夹的 通过File对象 我们可以读取文件或者文件夹的属性数据 如果我们需要读取文件的内容数据 那么我们需要使用IO流技术 IO流 Input Output IO流解决问题 解决设备与设备之间的数据传输问题
  • Windows 10安装WSA(WindowsSubsystemForAndroid)

    0 Win10安装好了仍然不能用 Win10安装好了仍然不能用 Win10安装好了仍然不能用 抱着试一试的心态装了一下 果然不行 随手记录下 1 首先 直接在应用商店里下载WSA是会报错的 所以要从微软商店把这个包下载下来 打开https
  • 下载 arm-linux-gcc

    https releases linaro org components toolchain binaries latest 4 arm linux gnueabihf 如果你使用的是ubuntu系统 你可以使用apt方式来安装arm li
  • mybatis plus中update_time字段未自动更新

    参考 MyBatis Plus官方文档 mybatis plus对于create time update time这样的数据库字段提供了自动插入功能 不用每次都手动进行更新 使用指南 加 TableField注解 自定义实现类TimeMet
  • 抗击疫情,AI可以做些什么?

    目前 新冠疫情的发展 可以说无时无刻不在牵动着大家的心 在这样的历史背景下 作为人工智能 数据科学领域的从业者 我们不妨来探讨一下 AI在遏制类似的疾病传播中 可以起到什么样的作用 当然 单纯靠AI技术确实无法让病毒停止传播 在一定时期内
  • STM32的单脉冲模式实现精确个数脉冲

    我们在做嵌入式产品的开发过程中 有时需要输出指定数目的脉冲 实现它的方法较多 这里介绍一种利用 STM32定时器的单脉冲模式来实现的方法 STM32定时器的单脉冲输出功能 其实是定时器输出比较功能的一个特殊应用 即让定时器在某个事件触发后的
  • keil mdk代码提示与代码补全设置

    主要参考https blog csdn net w5862338 article details 50520423 结合自己的实际问题 一旦习惯了一些实用的功能 当进入到类似的环境中而没有熟悉的功能 会觉得很不方便 代码提示与补全就是这样实
  • 60-400-045-使用-binlog-Maxwell读取MySQL binlog日志到Kafka

    文章目录 启动MySQL 创建maxwell的数据库和用户 在MySQL中创建一个测试数据库和表 启动Zookeeper 启动kafka 并创建主题为maxwell的topic 启动kafaka的消费者 检查数据是否到位 启动maxwell
  • [网络安全]sqli-labs Less-17 解题详析

    考察报错注入 本文使用extractvalue进行注入 原理及姿势可参考 网络安全 sqli labs Less 5 解题详析 判断注入类型 由以下回显可知 注入类型为单引号注入 查库名 账号输入admin 密码输入 1 and extra
  • Visual C++6.0的安装及使用教程

    Visual C 6 0下载链接 链接 https pan baidu com s 18ubNr9Gor3GbRrAkJe612w 密码 piek 对刚学习C语言或C 的小伙伴们来说 一款简单好用的编译器必不可少 今天给大家介绍的是Visu
  • 深度学习小白——DenseNet学习

    原论文地址 https arxiv org abs 1608 06993 用Keras写的pre model代码地址 https github com flyyufelix DenseNet Keras 一 主要原理 其借鉴了ResNet的