目录
- 1. ResNet的由来
- 2. ResNet pytorch实现
1. ResNet的由来
2014年网络层次达到了22层以后,随着层数的增多,反而性能会越来越差,其原因是ΔE对ΔWij的导数依赖于上一层的δ,由于δ误差不断积累,导致出现梯度弥散的问题。
假设网络有30层,为了保证在22层基础上增加8层后,至少不会比22层差,那么就跳过8层网络,增加一个shortcut短路连接,然后用22层的梯度与8层梯度计算结果进行按元素相加操作,从而使得30层的结果至少不会比22层差。
普通的一个神经网络单元是Conv-BN-Pool-ReLu,而resnet的一个unit是Conv-relu-Conv-relu
一般深度残差模块是2~3层。
上图中展示了输出输出都是256,使用的都是3x3的卷积核,参数量大概是600k,而使用1x1的核将256降至64,再使用3x3的核,最后用一个1x1的核将维度扩展到256,参数量大概是70k左右,因此残差模块,在中间过程不必保持和输入维度一致。
2. ResNet pytorch实现
如下图,pytorch实现了一个残差模块,注意:elementwise必须保证相加的tensor维度一致,因此如果输入与输出维度不一致,代码中通过extra函数将输入通过1x1的核将维度扩展成和输出一致。