简介
残差连接是一种非常重要的网络结构创新,最早被广泛应用于ResNet(Residual Neural Network)模型中,由何凯明等人在2015年的论文"Deep Residual Learning for Image Recognition"中提出。
核心思想
通过引入“shortcut connections”或者叫做捷径,直接将输入信息跳过若干层传到后面较深的层,然后将这个信息与经过多层非线性变换后的输出进行相加。这样做可以有效缓解随着网络深度增加而出现的梯度消失和梯度爆炸问题,使得训练更深的神经网络成为可能,并且能够显著提升模型的性能。
结构
示例
Keras实现残差结构
import keras
from keras.layers import Conv2D, Add
from keras.models import Model
# 定义一个模型
input_layer = keras.Input(shape=(64, 64, 3)) # 创建一个输入层
# 添加一个卷积层,输出维度为64,激活函数为ReLU
x = Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu')(input_layer)
# 添加一个卷积层,输出维度为64,激活函数为ReLU
y = Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu')(x)
# 添加一个卷积层,输出维度为64,激活函数为ReLU,用于残差连接
residual = Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu')(y)
# 将原始输入与残差相加,得到最终输出
output_layer = Add()([x, residual])
# 使用输入层和输出层创建模型
model = Model(inputs=input_layer, outputs=output_layer)
# 使用Adam优化器和均方误差损失函数编译模型
model.compile(optimizer='adam', loss='mse')
# 打印模型的结构信息,包括每一层的名称、输出维度等
model.summary()
模型结构
Model: "model"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 64, 64, 3)] 0 []
conv2d (Conv2D) (None, 64, 64, 64) 1792 ['input_1[0][0]']
conv2d_1 (Conv2D) (None, 64, 64, 64) 36928 ['conv2d[0][0]']
conv2d_2 (Conv2D) (None, 64, 64, 64) 36928 ['conv2d_1[0][0]']
add (Add) (None, 64, 64, 64) 0 ['conv2d[0][0]',
'conv2d_2[0][0]']
==================================================================================================
Total params: 75648 (295.50 KB)
Trainable params: 75648 (295.50 KB)
Non-trainable params: 0 (0.00 Byte)
Non-trainable params: 0 (0.00 Byte)