佛山网站建设正规公司/新闻类软文营销案例
🍨 本文为:[🔗365天深度学习训练营] 中的学习记录博客
🍖 原作者:[K同学啊 | 接辅导、项目定制]
要求:
- 根据 Pytorch 代码,编写出 TensorFlow 代码
- 研究 DenseNet 与 ResNetV 的区别
- 改进思路是否可以迁移到其他地方
一、前言
在计算机视觉领域,卷积神经网络(CNN)已经成为最主流的方法,比如GoogLenet,VGG-16,Incepetion等模型。CNN史上的一个里程碑事件是ResNet模型的出现,ResNet可以训练出更深的CNN模型,从而实现更高的准确度。ResNet模型的核心是通过建立前面层与后面层之间的“短路连接”进而训练出更深的CNN网络。
DenseNet,它的基本思路与ResNet一致,但是它建立的是前面所有层与后面层的密集连接(dense connection),它的名称也是由此而来。DenseNet的另一大特色是通过特征在channel上的连接来实现特征重用(feature reuse)。这些特点让DenseNet在参数和计算成本更少的情形下实现比ResNet更优的性能。
二、设计理念
相比ResNet,DenseNet提出了一个更激进的密集连接机制:即互相连接所有的层,具体来说就是每个层都会接受其前面所有层作为其额外的输入。
图1为ResNet网络的残差连接机制,作为对比,图2为DenseNet的密集连接机制。可以看到,ResNet是每个层与前面的某层(一般是2~4层)短路连接在一起,连接方式是通过元素相加。而在DenseNet中,每个层都会与前面所有层在channel维度上连接(concat)在一起(即元素叠加),并作为下一层的输入。
对于一个 L 层的网络,DenseNet共包含 个连接,相比ResNet,这是一种密集连接。而且DenseNet是直接concat来自不同层的特征图,这可以实现特征重用,提升效率,这一特点是DenseNet与ResNet最主要的区别。
图1:ResNet网络的短路连接机制(其中+代表的是元素级相加操作)
图2:DenseNet网络的密集连接机制(其中c代表的是channel级连接操作)
而对于DesNet,则是采用跨通道concat的形式来连接,会连接前面所有层作为输入,输入和输出的公式是Xl=Hl(X0,X1,...,Xl−1)。这里要注意所有的层的输入都来源于前面所有层在channel维度的concat,用一张动图体会一下:
图3 DenseNet的前向过程
三、网络结构
图4 DenseNet的网络结构
CNN网络一般要经过Pooling或者stride>1的Conv来降低特征图的大小,而DenseNet的密集连接方式需要特征图大小保持一致。为了解决这个问题,DenseNet网络采用DenseBlock+Transition的结构,其中DenseBlock是包含很多层的模块,每个层的特征图大小相同,层与层之间采用密集连接方式。而Transition层是连接两个相邻的DenseBlock,并且通过Pooling使特征图大小降低。图5给出了DenseNet的网路结构,它共包含4个DenseBlock,各个DenseBlock之间通过Transition层连接在一起。
图5 采用DenseBlock+Transition的DenseNet网络
在DenseBlock中,各个层的特征图大小一致,可以在channel维度上连接。DenseBlock中的非线性组合函数 H ( ⋅ )的是BN + ReLU + 3x3 Conv的结构,如图所示。另外值得注意的一点是,与ResNet不同,所有DenseBlock中各个层卷积之后均输入k个特征图,即得到的特征图的channel数为k,或者说采用k个卷积核。k在DenseNet称为growth rate,这是一个超参数。一般情况下使用较小的k,就可以得到较佳的性能。
图6 DenseBlock中的非线性转换结构
由于后面层的输入会非常大,DenseBlock内部可以采用bottleneck层来减少计算量,主要是原有的结构中增加1x1 Conv,如图7所示,即 BN + ReLU + 1x1 Conv + BN + ReLU + 3x3 Conv,称为DenseNet-B结构。其中1x1 Conv得到4k个特征图,它起到的作用是降低特征数量,从而提升计算的效率。
图7 使用bottleneck层的DenseBlock结构
对于Transition层,它主要是连接两个相邻的DenseBlock,并且降低特征图大小。Transition层包括一个1x1的卷积和2x2的AvgPooling,结构为BN+ReLU+1x1Conv+2x2AvgPooling。另外,Transition层可以起到压缩模型的作用。
四、Tensorflow实现
1.代码
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow import kerasdata_dir = "./data/bird_photos"
train_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.2, # 分割数据集subset="training", # 数据集类型seed=123,image_size=(224, 224),batch_size=32)val_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.2, # 分割数据集subset="validation", # 数据集类型seed=123,image_size=(224, 224),batch_size=32)class BottleNeck(keras.Model):def __init__(self, growth_rate, bn_size=4, dropout=0.3):super().__init__()self.bn1 = layers.BatchNormalization()self.relu = layers.Activation("relu"),self.conv1 = layers.Conv2D(filters=bn_size * growth_rate, kernel_size=(1, 1),strides=1, padding='same')self.bn2 = layers.BatchNormalization()self.conv2 = layers.Conv2D(filters=growth_rate, kernel_size=(3, 3),strides=1, padding='same')self.dropout = layers.Dropout(rate=dropout)self.listLayers = [self.bn1,self.relu,self.conv1,self.bn2,self.relu,self.conv2,self.dropout]def call(self, x):tem = xfor layer in self.listLayers.layers:x = layer(x)return layers.concatenate([tem, x], axis=-1)class Transition(tf.keras.Model):def __init__(self, growth_rate):super().__init__()self.bn1 = layers.BatchNormalization()self.relu = layers.Activation('relu')self.conv1 = layers.Conv2D(filters=growth_rate, kernel_size=(1, 1),strides=1, activation='relu', padding='same')self.pooling = layers.AveragePooling2D(pool_size=(2, 2), strides=2, padding='same')self.listLayers = [self.bn1,self.relu,self.conv1,self.pooling]def call(self, x):for layer in self.listLayers.layers:x = layer(x)return xclass DenseBlock(tf.keras.Model):def __init__(self, num_layer, growth_rate, bn_size=4, dropout=0.3, efficient=False):super().__init__()self.efficient = efficientself.listLayers = []if self.efficient:_x = tf.recompute_grad(BottleNeck(growth_rate, bn_size=bn_size, dropout=dropout))else:_x = BottleNeck(growth_rate, bn_size=bn_size, dropout=dropout)for _ in range(num_layer):self.listLayers.append(BottleNeck(growth_rate, bn_size=bn_size, dropout=dropout))def call(self, x):for layer in self.listLayers.layers:x = layer(x)return xclass DenseNet(tf.keras.Model):def __init__(self, num_init_feature, growth_rate, block_config, num_classes,bn_size=4, dropout=0.3, compression_rate=0.5, efficient=False):super().__init__()self.num_channels = num_init_featureself.conv = layers.Conv2D(filters=num_init_feature, kernel_size=7,strides=2, padding='same')self.bn = layers.BatchNormalization()self.relu = layers.Activation('relu')self.max_pool = layers.MaxPool2D(pool_size=3, strides=2, padding='same')self.dense_block_layers = []for i in block_config[:-1]:self.dense_block_layers.append(DenseBlock(num_layer=i, growth_rate=growth_rate,bn_size=bn_size, dropout=dropout, efficient=efficient))self.num_channels = compression_rate * (self.num_channels + growth_rate * i)self.dense_block_layers.append(Transition(self.num_channels))self.dense_block_layers.append(DenseBlock(num_layer=block_config[-1], growth_rate=growth_rate,bn_size=bn_size, dropout=dropout, efficient=efficient))self.avgpool = layers.GlobalAveragePooling2D()self.fc = tf.keras.layers.Dense(units=num_classes, activation=tf.keras.activations.softmax)def call(self, x):x = self.conv(x)x = self.bn(x)x = self.relu(x)x = self.max_pool(x)for layer in self.dense_block_layers.layers:x = layer(x)x = self.avgpool(x)return self.fc(x)model = DenseNet(num_init_feature=64,growth_rate=32,block_config=[6, 12, 24, 16],compression_rate=0.5,num_classes=4,dropout=0.0,efficient=True)x = tf.random.normal((1, 224, 224, 3))
for layer in model.layers:x = layer(x)print(layer.name, 'output shape:\t', x.shape)AUTOTUNE = tf.data.AUTOTUNEtrain_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
opt = tf.keras.optimizers.Adam(learning_rate=0.002, decay=0.01)model.compile(optimizer=opt,loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])
epochs = 10
history = model.fit(train_ds, validation_data=val_ds, epochs=epochs)
2.输出
Found 565 files belonging to 4 classes.
Using 113 files for validation.
conv2d output shape: (1, 112, 112, 64)
batch_normalization output shape: (1, 112, 112, 64)
activation output shape: (1, 112, 112, 64)
max_pooling2d output shape: (1, 56, 56, 64)
dense_block output shape: (1, 56, 56, 256)
transition output shape: (1, 28, 28, 128)
dense_block_1 output shape: (1, 28, 28, 512)
transition_1 output shape: (1, 14, 14, 256)
dense_block_2 output shape: (1, 14, 14, 1024)
transition_2 output shape: (1, 7, 7, 512)
dense_block_3 output shape: (1, 7, 7, 1024)
global_average_pooling2d output shape: (1, 1024)
dense output shape: (1, 4)
Epoch 1/10
15/15 [==============================] - 83s 5s/step - loss: 2.5051 - accuracy: 0.4508 - val_loss: 37955.5703 - val_accuracy: 0.3186
Epoch 2/10
15/15 [==============================] - 75s 5s/step - loss: 1.1275 - accuracy: 0.6922 - val_loss: 3854.2537 - val_accuracy: 0.2301
Epoch 3/10
15/15 [==============================] - 78s 5s/step - loss: 0.6559 - accuracy: 0.7780 - val_loss: 794.8064 - val_accuracy: 0.3186
Epoch 4/10
15/15 [==============================] - 84s 6s/step - loss: 0.5599 - accuracy: 0.7926 - val_loss: 94.6405 - val_accuracy: 0.2655
Epoch 5/10
15/15 [==============================] - 74s 5s/step - loss: 0.7278 - accuracy: 0.7682 - val_loss: 45.8066 - val_accuracy: 0.3186
Epoch 6/10
15/15 [==============================] - 74s 5s/step - loss: 0.3567 - accuracy: 0.8904 - val_loss: 16.1634 - val_accuracy: 0.3186
Epoch 7/10
15/15 [==============================] - 74s 5s/step - loss: 0.2239 - accuracy: 0.9287 - val_loss: 10.3661 - val_accuracy: 0.3186
Epoch 8/10
15/15 [==============================] - 75s 5s/step - loss: 0.1488 - accuracy: 0.9406 - val_loss: 1.8957 - val_accuracy: 0.5044
Epoch 9/10
15/15 [==============================] - 75s 5s/step - loss: 0.1024 - accuracy: 0.9630 - val_loss: 1.1245 - val_accuracy: 0.6018
Epoch 10/10
15/15 [==============================] - 76s 5s/step - loss: 0.0563 - accuracy: 0.9895 - val_loss: 1.2219 - val_accuracy: 0.5133
具体代码细节在之前的文章中已有涉及,故不再做具体解释。
相关文章:

深度学习Day-19:DenseNet算法实战与解析
🍨 本文为:[🔗365天深度学习训练营] 中的学习记录博客 🍖 原作者:[K同学啊 | 接辅导、项目定制] 要求: 根据 Pytorch 代码,编写出 TensorFlow 代码研究 DenseNet 与 ResNetV 的区别改进思路是…...

基于openssl实现AES ECB加解密
AES加密,全称高级加密标准(Advanced Encryption Standard),是一种广泛使用的对称加密算法,用于保护电子数据的安全。以下是AES加密的基本原理和特点: 基本概念 对称加密:AES是一种对称加密算法…...

Git:从配置到合并冲突
目录 1.前言 2.Git的下载与初始化配置 3.Git中新建仓库 4.Git的工作区域和文件状态 5.Git中查看操作和提交记录 6.Git中添加和提交文件 7.Git中回退提交版本 8.Git中查看版本间的差异 9.Git中删除文件 10.Git中忽略指定文件 11.Git中配置SSH密钥 12.Git中关联克隆仓库 13.Git中…...

leetcode hot100 之 最长公共子序列
题目 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(…...

短剧APP开发,新的“财富”
在数字化时代,开发短剧APP不仅是顺应潮流的必然选择,更是抓住市场机遇的关键所在。为确保短剧APP能有效地吸引并留住用户,以下是一些主要功能及其介绍: 1、短剧搜索 关键词搜索:用户可以通过输入关键词(如…...

Uniapp与第三方应用数据通讯
首先说明一点,这个只是uniapp代码编写的应用之间相互传递数据,uniapp编写的与其他语言编写的我尚不知道能不能传递。 应用1: plus.runtime.launchApplication({pname: "应用的appid",// extra 中可以自定数据,url和da…...

AI大模型战场:通用大模型与垂直大模型的角逐
随着人工智能技术的迅猛发展,AI大模型已成为推动科技进步的重要力量。然而,在AI大模型的战场上,通用大模型与垂直大模型之间的分化日益明显。两者各有其独特的优势和潜力,在不同的应用场景中发挥着重要作用。那么,在这…...

linux的一些知识点分享-------关于操作维护的一些知识点
Apache服务器的监听端口,默认为() Apache服务器的监听端口,默认为80。 vsftpd中,可以不需提供账号密码就能进行访问的用户是( ) 在vsftpd(Very Secure FTP Daemon)中,可以不需要提供账号密码就能进行访问的用户通常是匿名用户。…...

Python使用tkinter库设置背景图片、label显示位置和label设置显示图片
tkinter 设置背景图片 label显示位置 label设置显示图片 from tkinter import * import tkinter as tk from PIL import ImageTk from PIL import Imagedef get_img(filename, width, height):im Image.open(filename).resize((width, height))im ImageTk.PhotoImage(im)…...

OpenStack是什么?
OpenStack是一个开源的云计算管理平台项目,它是一系列软件开源项目的组合。该项目由美国国家航空航天局(NASA)和Rackspace合作研发并发起,旨在提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack不仅是一个软…...

2024下《系统规划与管理师》50个高频考点汇总!背就有效
2024上半年软考考试已经结束,有不少小伙伴已经开始准备下半年软考了,但是大家要注意:今年高项仅考上半年一次,下半年考的高级科目只有系规难度相对较低,系规需要学习的内容比高项少很多,高项第四版教程731页…...

软件游戏提示msvcp140.dll丢失的原因分析及解决方法
在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“计算机缺失msvcp140.dll”。那么,这个错误是什么意思呢?它会造成哪些问题?小编将从以下几个方面进行详细解析。 一,了解msvcp140.dll是什么 …...

备战 清华大学 上机编程考试-冲刺前50%,倒数第3天
T1:水滴 - 模拟 这是一个经典的游戏。 在一个 𝑛𝑚 的棋盘上,每一个格子中都有一些水滴。 玩家的操作是,在一个格子中加一滴水。 当一个格子中的水滴数超过了 4,这一大滴水就会因格子承载不住而向外扩散。扩散的规…...

docker的安装及docker常用命令
目录 环境介绍docker卸载docker安装docker镜像命令查看docker可用的镜像查看docker可安装的镜像安装镜像删除镜像 docker容器命令查看容器启动容器启动示例进入容器内部停止容器删除容器容器和主机之间的文件复制 docker网络命令创建docker网络查看docker网络删除docker网络 do…...

Dell服务器根据GPU温度调整风扇转速
前言 dell服务器自动风扇是根据CPU温度来调速的,我跑AI的时候cpu温度不高但是GPU温度很高导致显卡卡死PVE虚拟机直接挂起无法运行,我看了下也没有基于显卡温度调速的脚本,于是我就自己写了一个 基于ipmi工具 乌班图等linux先安装ipmi apt …...

快捷键专栏 IDEA、Navicat、电脑、Excle、Word等
标题 电脑篇windowsR 配合以下常用命令连上公司网线WiFi速度变慢问题解决Windows10 设置鼠标右键在此处打开cmd和Powershell窗口、关机打开电脑诊断工具系统设置常用设置查看电脑出场日期 systeminfo删除文件显示已在另一个程序打开?找回回收站删除的文件WindowsR输…...

卸载MySQL5.0,安装MySQL8.0
卸载MySQL 1、以管理员身份运行cmd,删除MySQL服务 2、卸载MySQL 3、删除残余文件 4、清楚注册表 winR -> regedit 5、删除环境变量 安装MySQL步骤 官方下载地址 https://www.mysql.com/downloads/ 以上步骤即完成MySQL数据库安装。...

苹果WWDC重磅发布的IOS 18、Apple Intelligence背后的技术分析!
2024年6月10日,在2024年WWDC全球开发者大会上,苹果推出了Apple Intelligence,这是深度集成到iOS 18、iPadOS 18和macOS Sequoia中的个人智能系统。 为了让大模型能在 iPhone 端侧跑,苹果还是做了很多事情的。接下来就跟大家介绍一…...

Linux基础IO【II】
今天,我们接着在上一篇文章的基础上,继续学习基础IO。观看本文章之前,建议先看:Linux基础IO【I】,那,我们就开始吧! 一.文件描述符 1.重新理解文件 文件操作的本质:进程和被打开文件…...

DevExpress学习系列文章
一:DevExpress Installed 二:Application UI 三:Data Management Controls 四:Skins 五:DevExpress 控件和库 系列文章相关代码:DevExpressDemo: DevExpress学习过程中的Demo...

在大数据时代:为何硬盘仍是数据中心存储的核心
在云计算和人工智能应用场景不断涌现的时代背景下,数据集的价值急剧上升,硬盘对于数据中心运营商来说变得比以往任何时候都更为关键。硬盘存储了全球大部分的艾字节(EB)数据,行业分析师预计,在艾字节持续增…...

安装TrinityCore NPCBot(尝试中)
安装TrinityCore NPCBot 基本安装方法 Follow TrinityCore Installation Guide (https://TrinityCore.info/) to install the server firstDownload NPCBots.patch and put it into your TrinityCore folderApply the patch using patch -p1 < NPCBots.patch command (crea…...

Java SE LTS版本商用收费,有那些开源的替代方案?
🚀 Java SE LTS版本商用收费,有那些开源的替代方案? 摘要 Java 对于云服务、大数据、电子商务、支付、欺诈和身份、交易等许多应用程序来说都是至关重要的语言。然而,Oracle 对 Java SE LTS 版本的商用收费政策引发了广泛关注和…...

Win系统 锁屏自动暂停音乐
Windows 的系统锁屏功能可以让我们在离开电脑前时保护我们的系统安全,而如果你正在播放音乐的话,锁屏开启后默认是继续播放的。 这就导致在公共场合下别人很容易能够通过你的电脑屏幕看到你在听什么,这里介绍一种通过 AutoHotkey 实现锁屏自动…...

ffmpeg实现视频播放 ----------- Javacv
什么是Javacv和FFmpeg? Javacv是一个专门为Java开发人员提供的计算机视觉库,它基于FFmpeg和Opencv库,提供了许多用于处理图 像、视频和音频的功能。FFmpeg是一个开源的音视频处理工具集,它提供了用于编码、解码、转换和播放音视频…...

解决更新Android Studio后下载Gradle超时
随着Android Studio的更新,所需要的最低Gradle版本也在变化,这时候构建项目的时候就需要先下载所需的Gradle发行版。对于Gradle构建项目,我们已经知道项目使用的Gradle是在根项目的gradle/wrapper/gradle-wrapper.properties文件中定义的&…...

智能合约漏洞类型
Are We There Yet? Unraveling the State-of-the-Art Smart Contract Fuzzers | Proceedings of the IEEE/ACM 46th International Conference on Software Engineering...

6.7.31 使用端到端训练的基于 EfficientNet 的卷积网络在双视图乳房 X 线摄影中进行乳腺癌诊断
最好的技术之一进行了两次迁移学习:第一种是使用在自然图像上训练的模型来创建“块分类器”,对子图像进行分类;第二种是使用块分类器扫描整个乳房 X 光检查并创建“单视图全图像分类器”。建议进行第三次迁移学习,以获得一个“双视图分类器”,以使用两个乳房 X 光检查视图…...

访问方法(反射)
文章目录 前言一、访问成员方法的方法二、Method类 1.常用方法2.实操展示总结 前言 为了实现在某类中随时可以调用其他类的方法,java.lang.reflect包中提供了Method方法类来实现该效果。每一个Method对象代表着一个方法,利用Methoc对象可以操纵相应的方法…...

探索Excel的隐藏功能:如何求和以zzz开头的列
哈喽,大家好,我是木头左! 步骤一:定位"zzz"开头的列 需要找到所有以"zzz"开头的列。在Excel中,你可以通过以下几种方法来实现: 手动查找:滚动查看列标题,找到…...