深度学习(09)-- DenseNet

文章目录

  • 目录
    • 1.DenseNet网络结构
    • 2.稠密连接及其优点
    • 3.代码实现
    • 4.补充说明

目录

1.DenseNet网络结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.稠密连接及其优点

每层以之前层的输出为输入,对于有L层的传统网络,一共有L个连接,对于DenseNet,则有L*(L+1)/2。

这篇论文主要参考了Highway Networks,Residual Networks (ResNets)以及GoogLeNet,通过加深网络结构,提升分类结果。

加深网络结构首先需要解决的是梯度消失问题

解决方案是:尽量缩短前层和后层之间的连接。
比如上图中,H4层可以直接用到原始输入信息X0,同时还用到了之前层对X0处理后的信息,这样能够最大化信息的流动。
反向传播过程中,X0的梯度信息包含了损失函数直接对X0的导数,有利于梯度传播。

在这里插入图片描述
DenseNet具体网络结构:
在这里插入图片描述

3.代码实现

conv block、transition block、Dense block

def conv_block(x, stage, branch, nb_filter, dropout_rate=None, weight_decay=1e-4):"""Apply BatchNorm, Relu, bottleneck 1x1 Conv2D, 3x3 Conv2D, and option dropout# Argumentsx:             input tensor stage:         index for dense blockbranch:        layer index within each dense blocknb_filter:     number of filtersdropout_rate:  dropout rateweight_decay:  weight decay factor"""eps = 1.1e-5conv_name_base = 'conv' + str(stage) + '_' + str(branch)relu_name_base = 'relu' + str(stage) + '_' + str(branch)" 1*1 convolutional (Bottleneck layer)"inter_channel = 4 * nb_filterx = BatchNormalization(epsilon=eps, axis=3, gamma_regularizer=l2(weight_decay),beta_regularizer=l2(weight_decay), name=conv_name_base+'_x1_bn')(x)x = Activation('relu', name=relu_name_base + '_x1')(x)x = Conv2D(filters=inter_channel, kernel_size=(1,1), strides=(1,1), padding='same',kernel_initializer='he_uniform',kernel_regularizer=l2(weight_decay),name=conv_name_base + '_x1')(x)if dropout_rate:x = Dropout(dropout_rate)(x)" 3*3 convolutional"x = BatchNormalization(epsilon=eps, axis=3, gamma_regularizer=l2(weight_decay),beta_regularizer=l2(weight_decay), name=conv_name_base + '_x2_bn')(x)x = Activation('relu', name=relu_name_base + '_x2')(x)x = Conv2D(filters=nb_filter, kernel_size=(3,3), strides=(1,1), padding='same', kernel_initializer='he_uniform',kernel_regularizer=l2(weight_decay),name=conv_name_base + '_x2')(x)if dropout_rate:x = Dropout(dropout_rate)(x)return xdef transition_block(x, stage, nb_filter, compression=1.0, dropout_rate=None, weight_decay=1e-4):"""Apply BatchNorm, 1x1 Convolution, averagePooling, optional compression, dropout # Argumentsx:             input tensorstage:         index for dense blocknb_filter:     number of filterscompression:   calculated as 1 - reduction. Reduces the number of feature maps in the transition block.dropout_rate:  dropout rateweight_decay:  weight decay factor"""eps = 1.1e-5conv_name_base = 'conv' + str(stage) + '_blk'relu_name_base = 'relu' + str(stage) + '_blk'pool_name_base = 'pool' + str(stage) x = BatchNormalization(epsilon=eps, axis=3, name=conv_name_base + '_bn')(x)x = Activation('relu', name=relu_name_base)(x)x = Conv2D(filters=int(nb_filter * compression), kernel_size=(1,1), strides=(1,1), padding='same', name=conv_name_base)(x)if dropout_rate:x = Dropout(dropout_rate)(x)x = AveragePooling2D((2,2), strides=(2,2), name=pool_name_base)(x)return xdef dense_block(x, stage, nb_layers, nb_filter, growth_rate, dropout_rate=None, weight_decay=1e-4, grow_nb_filters=True):"""Build a dense_block where the output of each conv_block is fed to subsequent ones# Argumentsx:               input tensorstage:           index for dense blocknb_layers:       the number of layers of conv_block to append to the model.nb_filter:       number of filtersgrowth_rate:     growth ratedropout_rate:    dropout rateweight_decay:    weight decay factorgrow_nb_filters: flag to decide to allow number of filters to grow"""eps = 1.1e-5concat_feat = xfor i in range(nb_layers):branch = i+1x = conv_block(concat_feat, stage, branch, growth_rate, dropout_rate, weight_decay)concat_feat = concatenate([concat_feat, x], axis=3, name='concat_' + str(stage) + '_' + str(branch))if grow_nb_filters:nb_filter += growth_ratereturn concat_feat, nb_filter

DenseNet-BC-121

def DenseNet_BC_121(input_shape=(64,64,3), nb_dense_block=4, growth_rate=32, nb_filter=16,reduction=0.0, dropout_rate=0.0, classes=6, weight_decay=1e-4, weights_path=None):"""Instantiate the DenseNet 121 architecture,# Argumentsnb_dense_block:  number of dense blocks to add to endgrowth_rate:     number of filters to add per dense blocknb_filter:       initial number of filtersreduction:       reduction factor of transition blocks.dropout_rate:    dropout rateweight_decay:    weight decay factorclasses:         optional number of classes to classify imagesweights_path:    path to pre-trained weights# ReturnsA Keras model instance."""eps = 1.1e-5compression = 1.0 - reductionnb_layers = [6,12,24,16]x_input = Input(input_shape)"Initial convolution"x = Conv2D(filters=nb_filter, kernel_size=(7,7), strides=(1,1), padding='same', name='conv1')(x_input)x = BatchNormalization(epsilon=eps, axis=3, name='conv1_bn')(x)x = Activation('relu', name='relu1')(x)x = MaxPooling2D((3,3), strides=(2,2), padding='same', name='pool1')(x)"Add dense blocks"for block_idx in range(nb_dense_block - 1):stage = block_idx + 2x, 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)"the last dense block does not have a transition"final_stage = stage + 1x, 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=3, name='conv' + str(final_stage) + 'blk_bn')(x)x = Activation('relu', name='relu' + str(final_stage) + '_blk')(x)x = GlobalAveragePooling2D(name='pool' + str(final_stage))(x)x = Dense(classes, activation='softmax', name='softmax_prob')(x)model = Model(inputs=x_input, outputs=x, name='DenseNet_BC_121')if weights_path is not None:model.load_weights(weights_path)return model

4.补充说明

DenseNet网络更窄、参数更少
在这里插入图片描述

在这里插入图片描述
文中还用到dropout操作来随机减少分支,避免过拟合,毕竟这篇文章的连接确实多。

** 原作者的一些解释 **
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis——缓存击穿/穿透/雪崩

缓存穿透 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就去后端系统查找(比如DB)。 一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透…

python(15)-window7配置iPython

前提:安装了Pythonanaconda anaconda安装参考:https://www.zhihu.com/question/58033789 在window系统下可以使用两种方法来实现类似与于Linux终端命令运行程序的方法(推荐方式2): 1.cmd:自己没有操作过,可以参考下面…

深度学习(10)-- Capsules Networks(CapsNet)

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/malele4th/article/details/79430464 </div><div id"content_views" class"markdown_views"><!-- flowchart 箭头图标 勿删 --&g…

手把手maven的功能/安装/使用/idea集成

看这篇文章不用着急安装&#xff0c;跟着步骤一定会成功&#xff0c;要理解maven是什么&#xff0c;如何使用。 介绍 maven官网 对于一个小白来说&#xff0c;官网有用的信息就是这些 不管如何介绍maven&#xff0c;作为使用者来说&#xff0c;主要感觉两个方面有帮助&#x…

python(16)-列表list,for循环

高级数据类型--列表1列表定义2列表中取值3列表的增&#xff0c;删&#xff0c;查&#xff0c;改3.1修改指定位置的数据3.2确定指定元素的索引3.3增加操作3.4删除操作3.5 元素是否存在与列表中 in3.6在指定索引位置插入元素4列表的数据统计5列表排序6列表的循环遍历-for7多维度l…

深度学习(11)-- GAN

TensorFlow &#xff08;GAN&#xff09; 目录 TensorFlow &#xff08;GAN&#xff09;目录1、GAN1.1 常见神经网络形式1.2 生成网络1.3 新手画家 & 新手鉴赏家1.4 GAN网络1.5 例子 1、GAN 今天我们会来说说现在最流行的一种生成网络, 叫做 GAN, 又称生成对抗网络, 也…

redis——数据结构和对象的使用介绍

redis官网 微软写的windows下的redis 我们下载第一个 额案后基本一路默认就行了 安装后&#xff0c;服务自动启动&#xff0c;以后也不用自动启动。 出现这个表示我们连接上了。 redis命令参考链接 String 字符串结构 struct sdshdr{//记录buf数组中已使用字节的数量int …

Python模块(1)-Argparse 简易使用教程

argparse 简易使用教程1.概况2. action3. argparse 使用demo3.1 argparse 实现加法器3.2 D-Model parser1.概况 argparse是Python中用于解析命令行参数的一个模块&#xff0c;可以自动生成help和usage信息&#xff1b;当从终端输入的参数无效时&#xff0c;模块会输出提示信息…

redis——NOSQL及redis概述

NoSql入门概述 单机Mysql的美好时代 瓶颈&#xff1a; 数据库总大小一台机器硬盘内存放不下数据的索引&#xff08;B tree&#xff09;一个机器的运行内存放不下访问量&#xff08;读写混合&#xff09;一个实例不能承受Memcached&#xff08;缓存&#xff09; MySql 垂直拆…

Python(17)-元组tuple

高级数据类型--元组1.元组的定义2.元组基本操作3.元组的循环遍历4.元组的应用场景5.元组与格式化字符串6.元组与列表之间的转换元组的最大特征就是可访问不可改&#xff0c;可作为字典的键值&#xff0c;因为键值必须是唯一的。字符串也是不可边类型&#xff0c;因此也适合做字…

深度学习(莫烦 神经网络 lecture 3) Keras

神经网络 & Keras 目录 神经网络 & Keras目录1、Keras简介1.1 科普: 人工神经网络 VS 生物神经网络1.2 什么是神经网络 (Neural Network)1.3 神经网络 梯度下降1.4 科普: 神经网络的黑盒不黑1.5 Why Keras?1.6 兼容 backend 2、如何搭建各种神经网络2.1 Regressor回归…

阿里Java编程规约(集合)

【强制】关于 hashCode 和 equals 的处理&#xff0c;遵循如下规则&#xff1a; 1&#xff09; 只要覆写 equals&#xff0c;就必须覆写 hashCode。 2&#xff09; 因为 Set 存储的是不重复的对象&#xff0c;依据 hashCode 和 equals 进行判断&#xff0c;所以 Set 存储的对…

Pytorch(3)-数据载入接口:Dataloader、datasets

pytorch数据载入1.数据载入概况Dataloader 是啥2.支持的三类数据集2.1 torchvision.datasets.xxx2.2 torchvision.datasets.ImageFolder2.3 写自己的数据类&#xff0c;读入定制化数据2.3.1 数据类的编写map-style范式iterable-style 范式2.3.2 DataLoader 导入数据类1.数据载入…

大数据学习(5)-- NoSQL数据库

文章目录目录1.NoSQL的介绍2.NoSQL产生的原因2.1 web2.02.2 NoSQL兴起原因3.NoSQL和关系数据库的区别4.NoSQL的四大类型4.1 键值数据库4.2 列族数据库4.3 文档数据库4.4 图形数据库4.5 不同类型的NoSQL数据库进行比较5.NoSQL的三大基石5.1 CAP5.2 base5.3 最终一致性6.从NoSQL到…

经典算法重点总结

文章目录排序算法冒泡排序直接插入排序希尔排序直接选择排序快速排序堆排序归并排序总结查找算法顺序查找二分查找插值查找斐波那契查找树表查找分块查找哈希查找总结排序算法 冒泡排序 void bubbleSort(int a[] , int n){for(int i n-1 ; i > 0 ; i--){for(int j 0 ; j …

redis——HyperLogLog

HyperLogLog 是一种概率数据结构&#xff0c;用来估算数据的基数。数据集可以是网站访客的 IP 地址&#xff0c;E-mail 邮箱或者用户 ID。 基数就是指一个集合中不同值的数目&#xff0c;比如 a, b, c, d 的基数就是 4&#xff0c;a, b, c, d, a 的基数还是 4。虽然 a 出现两次…

机器学习知识总结系列-机器学习中的优化算法总结(1-4)

文章目录1.梯度下降1.1批量梯度下降(BGD)1.2随机梯度下降&#xff08;SGD&#xff09;1.3 小批量随机梯度下降&#xff08;MSGD&#xff09;1.4 比较&#xff1a;1.5 动量算法&#xff08;momentum&#xff09;1.6 Nestrov Momentum2. 自适应方法2.1 自适应学习率算法&#xff…

Python(19)-字符串、Unicode字符串

高级数据类型--字符串、Unicode字符串1.字符串的定义2.字符串的长度、计数、Index3.字符串常用方法3.1判断类型3.2查找和替换3.3文本对齐3.4去除空白字符.strip()4.字符串的拆分和拼接5.字符串的切片6.跨行字符串7.包含转义字符r8.字符串的分割与连接9.Unicode字符串字符串-不变…

机器学习中的距离和损失函数

文章目录13.1 距离度量13.2 损失函数13.1 距离度量 距离函数种类&#xff1a;欧式距离、曼哈顿距离、明式距离&#xff08;闵可夫斯基距离&#xff09;、马氏距离、切比雪夫距离、标准化欧式距离、汉明距离、夹角余弦等常用距离函数&#xff1a;欧式距离、马氏距离、曼哈顿距离…

Python(20)-高级数据类型的公共方法

高级数据类型的公共方法1内置函数2高级数据类型切片3运算符&#xff0c;*&#xff0c;in4完整的for循环公共方法是列表&#xff0c;元组&#xff0c;字典&#xff0c;字符串都能使用的方法1内置函数 内置函数&#xff1a;不需要import导入模块&#xff0c;就可以直接使用的函数…