卷积神经网络基础学习1

本文介绍了Resnet模块及其在解决深度神经网络中梯度消失问题的作用。Resnet通过残差块使得信息可以直接传递到浅层,促进网络训练。此外,还讲解了Bottleneck结构,它利用1x1卷积减少参数量,有效降低了模型复杂度,是深度学习中常用的技术。Bottleneck结构通过1x1卷积层配合3x3卷积层,显著减少了网络参数,提高了计算效率。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

卷积神经网络基础学习1


一、Resnet模块

1.残差网络出现的原因
传统的卷积层层叠网络会遇到一个问题,当层数加深时,网络的表现越来越差,很大程度上的原因是因为当层数加深时,梯度消散得越来越严重,以至于反向传播很难训练到浅层的网络。为了解决这个问题,想出了一个“残差网络”,使得梯度更容易地流动到浅层的网络当中去,而且这种“skip connection”能带来更多的好处。
在这里插入图片描述

2.构建残差网络的代码
class BasicBlock(nn.Module):
expansion = 1

def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1,
             base_width=64, dilation=1, norm_layer=None):
    super(BasicBlock, self).__init__()
    if norm_layer is None:    
        norm_layer = nn.BatchNorm2d
    if groups != 1 or base_width != 64:
        raise ValueError('BasicBlock only supports groups=1 and base_width=64')
    if dilation > 1:
        raise NotImplementedError("Dilation > 1 not supported in BasicBlock")
    # Both self.conv1 and self.downsample layers downsample the input when stride != 1
    self.conv1 = conv3x3(inplanes, planes, stride)
    self.bn1 = norm_layer(planes)
    self.relu = nn.ReLU(inplace=True)
    self.conv2 = conv3x3(planes, planes)
    self.bn2 = norm_layer(planes)
    self.downsample = downsample
    self.stride = stride

def forward(self, x):
    identity = x

残差模块上一层传入的数据,保存进identity变量里;

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

先进行一次卷积,再批归一化,然后通过relu函数变成非线性数据,数据的维度不改变;

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

进行第二次卷积,之后批归一化,数据的维度仍不改变;
if self.downsample is not None:
identity = self.downsample(x)
如果下采样不是空值,则需将输入数据进行下采样,但设置为空值,则无需下采样,数据维度不改变;

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

将进行两次卷积后的数据与原数据进行相加得到新的数据,该数据既有原本未改变的数据特征,也有卷积后的数据特征。另外该数据可以训练网络前向传播时,即可将较为原始的数据特征带到深层去,在反向传播时,可以将较为原始的数据的梯度传回来,防止梯度的消失。同时能够在深层的神经网络进行训练。
return out


二、 Bottleneck

在如今的卷积神经网络模型训练中,神经网络的层数越来越深,相应的网络参数也越来越多,参数增多,就会增加计算量、模型复杂度、模型体积过大等诸多问题。那为了减少卷积层的网络参数,发明GoogleNet的团队发现,如果仅仅引入多个尺寸的卷积核,会带来大量的额外的参数,受到Network In Network中1×1卷积核的启发,为了解决这个问题,他们往Inception结构中加入了一些1×1的卷积核,如图所示:
在这里插入图片描述
在这里插入图片描述
根据上图,我们来做个对比计算,假设输入feature map的维度为256维,要求
输出维度也是256维。有以下两种操作:
⚫ 256维的输入直接经过一个3×3×256的卷积层,输出一个256维的feature map
,那么参数量为:256×3×3×256 = 589,824
⚫ 256维的输入先经过一个1×1×64的卷积层,再经过一个3×3×64的卷积层,最
后经过一个1×1×256的卷积层,输出256维,参数量为:256×1×1×64 +
64×3×3×64 + 64×1×1×256 = 69,632。足足把第一种操作的参数量降低到九
分之一!
⚫ 1×1卷积核也被认为是影响深远的操作,往后大型的网络为了降低参数量都会应
用上1×1卷积核。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值