残差网络 ResNet

今天学习了李沐深度学习pytorch版的残差网络相关的视频,重点内容总结如下:

ResNet简单理解

resnet的思想非常重要,简单来说呢就是有一个加法的计算在里面,如下图所示,输入x可以按照传统的串联的设计思路一步一步走下去,先经过卷积、BN层和ReLU激活函数等虚线框中的层,得到一个结果,该结果可以直接和跳转过来的输入x,进行相加操作,即思想类似于:
g ( x ) = x + f ( x ) g(x)=x+f(x) g(x)=x+f(x)
image-20250119172115200

也就是图中“短路”那一条线,好似一条快捷通道一样。在该条通道上有的需要经过1x1卷积层,有的不需要,判断标准是虚线框内卷积层的参数设置,如果需要更改输入的通道数及宽高(一般是高宽减半,通道数加倍),那么就需要加上1x1的卷积层来对输入同样进行高宽和通道数的增减处理,这样到后面才能进行相加操作。

Resnet的核心代码及相关注释如下所示:

import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l


class Residual(nn.Module):
    def __init__(self, input_channels, num_channels, use_1X1conv=False, strides=1):
        super().__init__()
        # 也就是说这里这个第一个卷积层的步幅stride可以设置 由传入参数设置 如果把他设置为2,那么高宽就会减半,同时可以设置成通道数加倍
        self.conv1 = nn.Conv2d(input_channels, num_channels,
                               kernel_size=3, padding=1, stride=strides)
        # 这里这个第二个卷积层就不设置步幅了 就采用默认值为1, 这个卷积层通道数不变 高宽也不变
        self.conv2 = nn.Conv2d(num_channels, num_channels, kernel_size=3, padding=1)

        if use_1X1conv:
            # 对于1x1卷积而言 默认情况步幅为1padding为0时输出高宽与输入高宽相同
            # 但padding=0, stride=2时,输出高宽会减半
            # 如果输出的高宽比输入小,则是下采样 ;如果输出的高宽比输入大,则是上采样。
            self.conv3 = nn.Conv2d(input_channels, num_channels, kernel_size=1, stride=strides)
        else:
            self.conv3 = None
        self.bn1 = nn.BatchNorm2d(num_channels)
        self.bn2 = nn.BatchNorm2d(num_channels)

    def forward(self, X):
        Y = F.relu(self.bn1(self.conv1(X)))
        Y = self.bn2(self.conv2(Y))
        if self.conv3:
            X = self.conv3(X)
        Y += X
        return F.relu(Y)


blk3 = Residual(3, 3)
# 批量大小  通道数  高度 宽度
X = torch.rand(4, 3, 6, 6)
Y = blk3(X)
print(Y.shape)

blk2 = Residual(3, 6, use_1X1conv=True, strides=2)
print(blk2(X).shape)

b1 = nn.Sequential(nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),
                   nn.BatchNorm2d(64), nn.ReLU(),
                   nn.MaxPool2d(kernel_size=3, stride=2, padding=1))


def resnet_block(input_channels, num_channels, num_residuals,
                 first_block=False):
    blk = []
    for
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值