创新点
提出残差结构,传统的神经网络在传递信息时会产生信息丢失,也会导致梯度爆炸或消失。ResNet在一定程度上解决了这个问题,通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络只需要学习输入、输出差别的那一部分,简化学习目标和难度。从旁路引出一条路到输出也称为shortcut 或者 skip connections.
resnet 有不同的网络层数,分别是18,34,50,101,152。
其中18 34 层和 50, 101 ,152 层所用的结构有些不同。
注意在残差结构,旁之路引出的输入和输出的通道数是一样的,但是因为卷积过程中每次经过一个大的卷积,图像尺寸会缩小为原来的1/2,同时通道数也变为原来的两倍。所以在每个大卷积到下一个大卷积过渡的过程中会出现输入和输出通道数不对等的情况出现。
因此,在旁之路中引出了1x1的卷积用来对图像进行升维度。从而保持输入输出的维度一致。如下图中的虚线结构。
但是
比较特殊的一点是,50, 101, 152层数,在pool层像conv2 过渡的过程中,因为给出的通道数是64, 但是旁之路输出的通道数确实256进行, 因此在50 101 152 刚开始进行conv2时 ,残差结构就需要(虚线)升维。这是两种结构的需要注意点。
对于每一个大的卷积层的,他的图像尺寸都会减半,卷积步长的调整都是第一个在3x3卷积上进行调整的。
不足之处请多多包涵。
import torch
import torch.nn as nn
# 18,34-layers残差结构
class BasicBlock(nn.Module):
expansion = 1
def __init__(self, in_channel, out_channel, stride=1, downsample=None):
super(BasicBlock,self).__init__()
self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel,
kernel_size=3, stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(out_channel)
self.relu = nn.ReLU(inplace=True)
self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel,
kernel_size=3, stride=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(out_channel)
self.downsample = downsample
def forward(self, x):
identity = x
if self.downsample is not None:
identity = self.downsample(x)
out = self.conv1(x)
out = self.bn1(out)
out