残差网络缓解了在深度神经网络中增加深度带来的梯度消失问题,使在实际效果中加深神经网络得到更好的训练结果理论成真。其主要由输入部分,多个残差块,全连接部分网络组成。
残差块即是指在计算时可以通过跳过某几层直接向后传到输出部分的几层网络组成,简单来说就是跳步进行权重的优化,具体形式如下图
残差块使得本来需要顺序执行的网络模式变得可以跳跃着执行,加速了训练的同时,使深层的神经网络在实际效果上更好,但使用残差块的时候仍有许多需要注意的地方,放在后面代码中说。
上干货,本次使用的数据集为Fashion_mnist,有10个种类的服装,像素大小为(28x28),有60000个数据。
首先需要通过自定义网络来创建残差块实现自己的layers.Layer
class Baisblock(layers.Layer):
def __init__(self,filter_num,stride=1):
super(Baisblock,self).__init__()
self.conv1 = layers.Conv2D(filter_num,(3,3),strides=stride,padding='same')
# 残差块的第一个卷积层
self.bn1 = layers.BatchNormalization()
# 将卷积层输出的数据批量归一化
self.relu = layers.ReLU()