PyTorch实现Residual Net
1.Residual Net产生的原因
深的网络一般会比浅的网络效果好,如果要进一步地提升模型的准确率,最直接的方法就是把网络设计得越深越好,这样模型的准确率也就会越来越准确。但是通过实验证得,如果简单地增加网络深度,随着网络深度的加深,会出现梯度消失和爆炸的问题,网络甚至出现了退化。如下图一个20层和一个56层的网络进行了对比,可看见56层网络的性能远低于20层网络。
利用“链式法则”求偏导,当网络层数加深时,梯度在传播过程中会逐渐消失,导致无法对前面网络层的权重进行有效的调整。ResNet就解决了网络加深所带来的问题,可以使网络能加深网络层数的同时又能解决梯度消失问题和提升模型精度。
2.Residual net实现
Residual net结构如下图右边所示
代码实现:
class ResidualBlock(nn.Module):
def __init__(self, channels):
super(ResidualBlock, self).__init__()
self.channels = channels
self.conv1 = nn.Conv2d(channels, channels,
kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(channels, channels,
kernel_size=3, padding=1)
def forward(self, x):
y = F.relu(self.conv1(x))
y = self.conv2(y)
return F.relu(x + y)
注:
- 第一个和第三个实线连接,都是3x3x64,由于通道相同,所以采用计算方式为H(x)=F(x)+x
- 第三个和第五个虚线连接,分别是3x3x64和3x3x128,通道不同,采用的计算方式为H(x)=F(x)+Wx其中W是卷积操作,用来调整x维度。