第J2周:ResNet50V2 算法实战与解析

FROM


我的环境

  • 语言环境:Python 3.11.9
  • 开发工具:Jupyter Lab
  • 深度学习环境:
    • torch==2.3.1+cu121
    • torchvision==0.18.1+cu121

一、本周内容和个人收获

1. v1和v2的区别

ResNet50V2是何恺明等人在ResNet基础上提出的改进版本,主要改进点在于残差结构和激活函数的使用。ResNetV2结构与原始ResNet结构的主要差别在于,原始ResNet结构先进行卷积操作,然后进行BN和激活函数计算,最后执行加法操作后再进行ReLU计算;而ResNetV2结构则是先进行BN和激活函数计算后卷积,把加法操作后的ReLU计算放到了残差结构内部。

ResNet v1 和 v2 的核心区别在于残差块(Residual Block)的内部结构:
在这里插入图片描述
1. 预激活设计:
v1:采用 “卷积层 -> BN层 -> ReLU” 的顺序
v2:采用 “BN层 -> ReLU -> 卷积层” 的顺序(预激活设计)
2. 信号流路径:
v1:identity分支在最后与主分支相加后再进行ReLU
v2:identity分支直接与主分支相加,不进行最后的ReLU

2. v2的主要结构

class ResNet50V2(nn.Module):
    def __init__(self, num_classes=1000):
        super(ResNet50V2, self).__init__()
        
        # 1. 初始层
        self.conv1 = nn.Sequential(
            nn.ZeroPad2d(3),
            nn.Conv2d(3, 64, kernel_size=7, stride=2),
            nn.ZeroPad2d(1),
            nn.MaxPool2d(kernel_size=3, stride=2)
        )
        
        # 2. 残差块堆叠
        self.conv2_x = self._make_layer(64, 64, blocks=3)    # 输出 256 通道
        self.conv3_x = self._make_layer(256, 128, blocks=4)  # 输出 512 通道
        self.conv4_x = self._make_layer(512, 256, blocks=6)  # 输出 1024 通道
        self.conv5_x = self._make_layer(1024, 512, blocks=3) # 输出 2048 通道
        
        # 3. 输出层
        self.post_bn = nn.BatchNorm2d(2048)
        self.post_relu = nn.ReLU(inplace=True)
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = nn.Linear(2048, num_classes)

二、核心代码及运行截图

模型代码:

import torch
import torch.nn as nn

class ResNet50V2(nn.Module):
    def __init__(self, 
                 include_top=True,      # 是否包含顶部的全连接层
                 preact=True,           # 是否使用预激活
                 use_bias=True,         # 是否使用偏置
                 input_shape=(3, 224, 224),  # 输入形状 (C,H,W)
                 pooling=None,          # 池化方式
                 num_classes=1000,      # 分类数量
                 classifier_activation='softmax'): # 分类层激活函数
        super(ResNet50V2, self).__init__()
        
        self.include_top = include_top
        self.preact = preact
        self.pooling = pooling
        
        # 初始层
        self.conv1_pad = nn.ZeroPad2d(3)
        self.conv1 = nn.Conv2d(input_shape[0], 64, kernel_size=7, 
                              stride=2, bias=use_bias)
        
        if not preact:
            self
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值