ResNet50《pytorch学习篇》

本文介绍了ResNet50网络的主要构成,包括Bottleneck结构,并详细解释了Bottleneck的设计原理。通过学习,可以理解如何解决深度学习中的梯度消失问题。此外,还提供了官方的PyTorch实现代码链接供参考。
摘要由CSDN通过智能技术生成

引言:resNet50网络作为res网络家族中的一员,特别强调的是残差网络是何大神提出的,轰动世界的大江南北,主要是因为:当时的卷积神经网络主要通过不断地增加卷积层来提取图像的特征,但是这会引发一个问题-----梯度爆炸问题或者梯度消失问题,也就是说卷积层的数量设置,必须有一定的限制,否则会出现物极必反的现象,然而此时,和大神就提出了残差网络,成功地解决了此类问题,也为自己在国际深度学习的领域奠定了基础。今天主要是学习一下是如何实现的,以一个简单的resNet网络为例子学习,下面一起来看看吧!!!(物极必反--古训)

1》res50主要构成:

        首先介绍一下网络的主要框架。如下:(主要由Bottleneck组成)

Sequential(
  (0): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
  (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (2): ReLU(inplace=True)
  (3): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True)
  (4): Sequential(
        (0)Bottleneck()
        (1)Bottleneck()
        (2)Bottleneck())
  (5): Sequential(
         (0): Bottleneck()
         (1): Bottleneck()
         (2): Bottleneck()
         (3): Bottleneck())
  (6): Sequential(
         (0): Bottleneck()
         (1): Bottleneck()
         (2): Bottleneck()
         (3): Bottleneck()
         (4): Bottleneck()
         (5): Bottleneck())
 (7): Sequential(
        (0): Bottleneck()
        (1): Bottleneck()
        (2): Bottleneck())

解释:这里的Bottleneck大同小异,差不多,但还是有区别滴,我的小可爱梦,请注意哦!!!

2》what is it Bottleneck?

so,here is :

import torch.nn as nn


class Bottleneck(nn.Module):
    expansion = 4

    def __init__(self, inplanes, planes, stride=1, downsample=None):
        super(Bottleneck, self).__init__()
        self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, stride=stride, bias=False) # change
        self.bn1 = nn.BatchNorm2d(planes)
        self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=1, # change
                    padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(planes)
        self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)
        self.bn3 = nn.BatchNorm2d(planes * 4)
        self.relu = nn.ReLU(inplace=True)
        self.downsample = downsample
        self.stride = stride

    def forward(self, x):
        residual = x

        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)

        out = self.conv2(out)
        out = self.bn2(out)
        out = self.relu(out)

        out = self.conv3(out)
        out = self.bn3(out)

        if self.downsample is not None:
            residual = self.downsample(x)

        out += residual
        out = self.relu(out)

        return out

解释:也是由基础的卷积、正则化、激活函数构成。只不过在此基础上增加了一个小插曲,residual (残差,类似于劈腿那种,第三者插入,盗用一张图!)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值