第J3周:DenseNet121算法实现01(Pytorch版)

news2025/3/28 4:35:57
  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

目标

具体实现

(一)环境

语言环境:Python 3.10
编 译 器: PyCharm
框 架: Pytorch

(二)具体步骤
1. DenseNet121.py
import torch  
import torch.nn as nn  
import torch.nn.functional as F  
import math  
  
  
# 实现DenseLayer(密集连接层)  
class DenseLayer(nn.Module):  
    def __init__(self, num_input_features, growth_rate, bn_size, drop_rate):  
        super(DenseLayer, self).__init__()  
        # BN -> ReLU -> Conv(1x1) -> BN -> ReLU -> Conv(3x3)  
        self.norm1 = nn.BatchNorm2d(num_input_features)  # 第一个批归一化层  
        self.relu1 = nn.ReLU(inplace=True)  # 第一个ReLU激活函数  
        self.conv1 = nn.Conv2d(num_input_features, bn_size * growth_rate,  
                               kernel_size=1, stride=1, bias=False)  # 1x1卷积层  
  
        self.norm2 = nn.BatchNorm2d(bn_size * growth_rate)  # 第二个批归一化层  
        self.relu2 = nn.ReLU(inplace=True)  # 第二个ReLU激活函数  
        self.conv2 = nn.Conv2d(bn_size * growth_rate, growth_rate,  
                               kernel_size=3, stride=1, padding=1, bias=False)  # 3x3卷积层  
  
        self.drop_rate = drop_rate  # Dropout率  
  
    def forward(self, x):  
        # 保存输入特征,用于后续的密集连接  
        new_features = self.norm1(x)  
        new_features = self.relu1(new_features)  
        new_features = self.conv1(new_features)  
  
        new_features = self.norm2(new_features)  
        new_features = self.relu2(new_features)  
        new_features = self.conv2(new_features)  
  
        # 如果设置了dropout,则应用dropout  
        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)  
  
  
# 实现DenseBlock(密集块)  
class DenseBlock(nn.Module):  
    def __init__(self, num_layers, num_input_features, bn_size, growth_rate, drop_rate):  
        super(DenseBlock, self).__init__()  
        # 创建指定数量的DenseLayer,每一层的输入特征数量都会增加  
        self.layers = nn.ModuleList()  
        for i in range(num_layers):  
            layer = DenseLayer(  
                num_input_features + i * growth_rate,  
                growth_rate=growth_rate,  
                bn_size=bn_size,  
                drop_rate=drop_rate  
            )  
            self.layers.append(layer)  
  
    def forward(self, x):  
        # 依次通过所有的DenseLayer  
        features = x  
        for layer in self.layers:  
            features = layer(features)  
        return features  
  
  
# 实现TransitionLayer(过渡层)  
class TransitionLayer(nn.Module):  
    def __init__(self, num_input_features, num_output_features):  
        super(TransitionLayer, self).__init__()  
        # BN -> Conv(1x1) -> AvgPool(2x2)  
        self.norm = nn.BatchNorm2d(num_input_features)  # 批归一化层  
        self.relu = nn.ReLU(inplace=True)  # ReLU激活函数  
        self.conv = nn.Conv2d(num_input_features, num_output_features,  
                              kernel_size=1, stride=1, bias=False)  # 1x1卷积层  
        self.pool = nn.AvgPool2d(kernel_size=2, stride=2)  # 平均池化层  
  
    def forward(self, x):  
        x = self.norm(x)  
        x = self.relu(x)  
        x = self.conv(x)  
        x = self.pool(x)  
        return x  
  
  
# 实现完整的DenseNet121模型  
class DenseNet121(nn.Module):  
    def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16),  
                 num_init_features=64, bn_size=4, drop_rate=0, num_classes=1000):  
        super(DenseNet121, self).__init__()  
  
        # 首先是一个7x7的卷积层,步长为2  
        self.features = nn.Sequential()  
        self.features.add_module('conv0',  
                                 nn.Conv2d(3, num_init_features, kernel_size=7, stride=2, padding=3, bias=False))  # 初始卷积层  
        self.features.add_module('norm0', nn.BatchNorm2d(num_init_features))  # 批归一化层  
        self.features.add_module('relu0', nn.ReLU(inplace=True))  # ReLU激活函数  
        self.features.add_module('pool0', nn.MaxPool2d(kernel_size=3, stride=2, padding=1))  # 最大池化层  
  
        # 依次添加DenseBlock和TransitionLayer  
        num_features = num_init_features  
        for i, num_layers in enumerate(block_config):  
            # 添加DenseBlock  
            block = DenseBlock(  
                num_layers=num_layers,  
                num_input_features=num_features,  
                bn_size=bn_size,  
                growth_rate=growth_rate,  
                drop_rate=drop_rate  
            )  
            self.features.add_module(f'denseblock{i + 1}', block)  
            num_features = num_features + num_layers * growth_rate  
  
            # 如果不是最后一个block,则添加TransitionLayer  
            if i != len(block_config) - 1:  
                # 过渡层将特征图数量减半  
                trans = TransitionLayer(  
                    num_input_features=num_features,  
                    num_output_features=num_features // 2  
                )  
                self.features.add_module(f'transition{i + 1}', trans)  
                num_features = num_features // 2  
  
        # 最后添加一个BatchNorm  
        self.features.add_module('norm5', nn.BatchNorm2d(num_features))  # 最终的批归一化层  
  
        # 全局平均池化和分类器  
        self.classifier = nn.Linear(num_features, num_classes)  # 全连接分类器  
  
        # 初始化权重  
        for m in self.modules():  
            if isinstance(m, nn.Conv2d):  
                nn.init.kaiming_normal_(m.weight)  # 使用Kaiming初始化卷积层权重  
            elif isinstance(m, nn.BatchNorm2d):  
                nn.init.constant_(m.weight, 1)  # 初始化批归一化层的权重为1  
                nn.init.constant_(m.bias, 0)  # 初始化批归一化层的偏置为0  
            elif isinstance(m, nn.Linear):  
                nn.init.constant_(m.bias, 0)  # 初始化全连接层的偏置为0  
  
    def forward(self, x):  
        features = self.features(x)  # 提取特征  
        out = F.relu(features, inplace=True)  # 应用ReLU激活函数  
        out = F.adaptive_avg_pool2d(out, (1, 1))  # 全局平均池化  
        out = torch.flatten(out, 1)  # 展平特征  
        out = self.classifier(out)  # 分类  
        return out  
  
  
# 创建DenseNet121模型实例  
def create_densenet121(num_classes=1000, pretrained=False):  
    model = DenseNet121(num_classes=num_classes)  
    return model  
  
  
# 使用示例  
if __name__ == "__main__":  
    # 创建模型  
    model = create_densenet121()  
    print(model)  
  
    # 创建随机输入张量 (batch_size, channels, height, width)    x = torch.randn(1, 3, 224, 224)  
  
    # 前向传播  
    output = model(x)  
    print(f"Input shape: {x.shape}")  
    print(f"Output shape: {output.shape}")

image.png

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

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

相关文章

webrtc3A算法

使用ubuntu18.04 选择webrtc_audio_processing v0.3 下载地址 https://gitlab.freedesktop.org/pulseaudio/webrtc-audio-processing/-/tree/master git clone 完 编译 # Initialise into the build/ directory, for a prefixed install into the # install/ directory meson …

让“树和二叉树”埋在记忆土壤中--性质和概念

Nice to meet your! 目录 树的介绍: 树的创建: 二叉树的概念和结构: 二叉树的存储结构: 树的介绍: 概念和结构: 不知你们是否在现实中看见过分为两个叉的枯树,大概长这样: 那…

Spring Boot整合SSE实现消息推送:跨域问题解决与前后端联调实战

摘要 本文记录了一次完整的Spring Boot整合Server-Sent Events(SSE)实现实时消息推送的开发过程,重点分析前后端联调时遇到的跨域问题及解决方案。通过CrossOrigin注解的实际应用案例,帮助开发者快速定位和解决类似问题。 一、项…

【工具分享】vscode+deepseek的接入与使用

目录 第一章 前言 第二章 获取Deepseek APIKEY 2.1 登录与充值 2.2 创建API key 第三章 vscode接入deepseek并使用 3.1 vscode接入deepseek 3.2 vscode使用deepseek 第一章 前言 deepseek刚出来时有一段时间余额无法充值,导致小编没法给大家发完整的流程&…

康谋方案 | AVM合成数据仿真验证方案

随着自动驾驶技术的快速发展,仿真软件在开发过程中扮演着越来越重要的角色。仿真传感器与环境不仅能够加速算法验证,还能在安全可控的条件下进行复杂场景的重复测试。 本文将分享如何利用自动驾驶仿真软件配置仿真传感器与搭建仿真环境,并对…

Linux内核IPv4路由选择子系统

一、基本知识 1.具体案例:直连路由 结构fib_nh表示下一跳,包含输出网络设备、外出接口索引等信息。 有两个以太网局域网 LAN1 和 LAN2,其中 LAN1 包含子网 192.168.1.0/24,而 LAN2 包含子网 192.168.2.0/24。在这两个 LAN 之…

NWAFU 生物统计实验二 R语言版

#1 setwd(修改为你的工作路径或桌面路径) feed_types <- c("A", "B", "C") weight_gain_means <- c(36.8, 34.9, 21.3) weight_gain_sds <- c(2.4, 2.7, 6.6) weight_gain <- rnorm(3, mean weight_gain_means, sd weight_gain_sd…

Thinkphp指纹识别

识别ThinkPHP框架(指纹) 1.ioc判断 /favicon.ico 2.报错 /1 然后使用工具梭哈

【AVRCP】蓝牙AVRCP协议中的L2CAP互操作性要求深度解析

目录 一、L2CAP互操作性要求&#xff08;针对AVRCP&#xff09; 1.1 核心概念 1.2 AVRCP对L2CAP的增强需求 1.3 关键机制解析 1.4 浏览通道优化配置 1.5 实际应用场景与解决方案 二、通道类型与配置 2.1. 通道类型限制 2.2 PSM字段规范 2.3. 实现意义 3.4. 实际应用…

剑指 Offer II 111. 计算除法

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20111.%20%E8%AE%A1%E7%AE%97%E9%99%A4%E6%B3%95/README.md 剑指 Offer II 111. 计算除法 题目描述 给定一个变量对数组 equations 和一个实数值数组 values 作…

掌握 WRF/Chem 模式:突破大气环境研究技术瓶颈的关键

技术点目录 第一部分、WRF-Chem模式应用案例和理论基础第二部分、Linux环境配置及WRF-CHEM第三部分、WRF-Chem模式编译&#xff0c;排放源制作第四部分、WRF-Chem数据准备&#xff08;气象、排放、初边界条件等&#xff09;&#xff0c;案例实践第五部分、模拟结果提取、数据可…

linux性能监控的分布式集群 prometheus + grafana 监控体系搭建

prometheusgrafana分布式集群资源监控体系搭建 前言一、安装 prometheus二、在要监控的服务器上安装监听器三、prometheus服务器配置四、grafana配置大屏五、创建Linux监控看板五、监控windows服务器注意事项 前言 Prometheus 是一个开源的 ​分布式监控系统 和 ​时间序列数据…

数字化转型 2.0:AI、低代码与智能分析如何重塑企业竞争力?

引言&#xff1a;数字化转型进入2.0时代 在过去的十几年里&#xff0c;企业的数字化转型&#xff08;1.0&#xff09;主要围绕信息化和自动化展开&#xff0c;例如引入ERP、CRM等系统&#xff0c;提高办公效率&#xff0c;减少人为失误。然而&#xff0c;随着市场竞争加剧&…

基于SpringBoot的“校园招聘网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园招聘网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 局部E-R图 系统首页界面 系统注册…

由LAC自动建立L2TP实验

一、实验拓扑: 二、实验配置 1.LAC的配置 基础配置: [LAC]int g 0/0/0 [LAC-GigabitEthernet1/0/0]ip address 192.168.0.1 24 [LAC]int g 1/0/0 [LAC-GigabitEthernet1/0/0]ip address 10.1.1.254 24 [LAC-GigabitEthernet1/0/0]int g1/0/1 [LAC-GigabitEthernet1/0/1]ip ad…

内网渗透(CSMSF) 构建内网代理的全面指南:Cobalt Strike 与 Metasploit Framework 深度解析

目录 1. Cobalt Strike 在什么情况下会构建内网代理&#xff1f; 2. Cobalt Strike 构建内网代理的主要作用和目的是什么&#xff1f; 3. Cobalt Strike 如何构建内网代理&#xff1f;需要什么条件和参数&#xff1f; 条件 步骤 参数 4. Cobalt Strike 内网代理能获取什…

SAP FAGLL03 追加并显示描述字段

目录 1、新建一个结构2、操作FAGLPOSX结构3、新建一个BADI 1、新建一个结构 1.1、先在SE11中新建一个结构&#xff1a;ZZADD_FIELDS_FAGL&#xff0c;把我们要显示的描述字段放在这个结构中 2、操作FAGLPOSX结构 2.1、在FAGLPOSX结构中选择Append Structure&#xff0c;把我…

Linux Vim 寄存器 | 从基础分类到高级应用

注&#xff1a;本文为 “vim 寄存器” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;略作重排。 未整理去重&#xff0c;如有内容异常&#xff0c;请看原文。 Registers 寄存器 Learning Vim registers is like learning algebra for the first ti…

Ubuntu版免翻墙搭建BatteryHistorian

摘要 昨天安装了一个翻墙版本的很不好用&#xff0c;主要是网络不稳定&#xff0c;故于是换了一个免翻墙的docker镜像。但是发现还是很难用。又安装了一个window版本的免翻墙的BatteryHistorian。明天再分享下Windows的免翻墙的BatteryHistorian步骤。 安装好Docker了就直接d…

Django Rest Framework 创建纯净版Django项目部署DRF

描述创建纯净版的Django项目和 Django Rest Framework 环境的部署 一、创建Django项目 1. 环境说明 操作系统 Windows11python版本 3.9.13Django版本 V4.2.202. 操作步骤(在Pycharm中操作) 创建Python项目drfStudy、虚拟环境 ​虚拟环境中安装 jdangopip install django==4.…