pytorch复现resnet(附个人理解)

本文介绍了ResNet网络的工作原理,重点解释了其如何通过残差学习解决深层网络的梯度消失问题。作者分享了个人对ResNet的理解,并提供了网络结构和PyTorch代码的复现过程,帮助读者深入理解ResNet的设计思想。
摘要由CSDN通过智能技术生成

pytorch复现resnet

1.Resnet网络介绍(个人理解)

​ 对于传统的CNN,层数在25层之前,准确率会随着层数增加提高。但是一旦层数过深,网络过于庞大,准确率反而会下降。而Resnet较好的解决了这一问题。其原因在于:

​ Resnet具有一定的记忆性,在第一次进入某个卷积块(多个卷积层)时,Tensor0(输入)通过卷积块进行前向传播得到Tensor1,之后,如果Tensor0Tensor1维数不一致,Tensor0通过downsample(下采样,包含一个卷积层和一个BatchNorm层)转成和Tensor1维度一致的Tensor2。然后将Tensor1Tensor2Tensor0(Tensor0,Tensor2取决于有没有downsample)相加,最后将上一步的结果通过relu激励函数,便得到一个卷积块最终的输出。这样的方法使得计算Tensor1等同于计算残差,而Tensor2就等同于原输入,这样的话即使Tensor1无法对识别做出贡献,Tensor2也不会让其影响之后的网络,可以有效避免梯度消失等问题,这种残差网络会使得网络之间的依赖性不会特别强,不会因为前面网络的问题影响整个网络的准确性。

ps:以上仅为个人理解,如有错误,欢迎批评

2.网络结构与复现代码

img

上图为下述代码中Block的一种特殊情况

img

上图为完整的网络结构,但是还有一些细节上面没有,比如bn,relu,以及什么时候size减半,下面我写的代码有介绍

import torch.nn as nn
import torch.nn.functional as F

class Block(nn.Module):
    def __init__(self,in_planes,out_planes,stride=1,downsample=None):
        super(Block,self).__init__()
        # conv1为网络中1*1的卷积核所在的那一层,以图片为例,为1*1,64
        self.conv1 = nn.Conv2d(in_planes,out_planes,kernel_size=1,stride=1,bias=False)
        self.bn1   = nn.BatchNorm2d(out_planes)
        # conv2为网络中3*3的卷积核所在的那一层,这一层的stride要根据构造函数中的stride变化,
        # 原因在于conv_2x卷积块的尺寸减半是maxpool的结果,所以之后的卷积不能再减小尺寸了,
        # 而conv3_x及以后的卷积块尺寸减半是stride=2的结果,同时要注意padding=1才能达到上述的尺寸变换
        self.conv2 = nn.Conv2d(out_planes,out_planes,kernel_size=3,stride=stride,padding=1,bias=False)  
        self.bn2   = nn.BatchNorm2d(out_planes)
        self.conv3 = nn.Conv2d(out_planes
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值