提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
卷积神经网络基础学习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卷积核。