Resnet即就是残差网络,本文主要是对于resnet给出的网络结构图进行简单解释。
以上就是34层网络的网络结构图。
以上是18层、34层、50层、101层以及152层网络所对应的残差块。
我刚开始在网上看到这两张图片的时候,感觉一点都不懂,后面学了一下,稍微懂了,所以写下这篇博文做个记录。
比如说第一张34层的网络结构图,它对应的是第二张图片的第四列。
在第四列中,每一行的大概解释如下:
第二行表示,从18层到152层的conv1都使用了64个7*7的卷积核,
第三行表示的是从18层到152层的conv2_x第一步也都使用了3*3的卷积核进行池化。
第四行表示con2_x的第二步执行了 3个残差块,每个残差块包含两步操作:使用64个3*3的卷积核,进行卷积,执行两次。而最终的结果shape为[56*56*64]
同样的,第五行(conv3_x)表示的是4个残差块,每个残差快包含两次相同的卷积:使用128个大小为3*3的卷积核进行卷积。
第六行、第七行类似前面。
第八行为均值池化,从而得到一个1000d的结果,在经过全连接层以及softmax激活函数得到 1*1的输出。
在第一张图中有些是虚线,而有些是直线,区别大概有一下几点:
简单来说就是,一个残差块对应的输入shape和输出shape相同,则用实现,否则用虚线。如果输入和输出的shape相同,则在计算的过程中可以直接将输入数据和输出结果相加,我们截取其中一个残差块:
在此图中,输入数据的shape为:[56 * 56* 64],而输出数据为:[28*28*64]
在此图中,输入数据的shape为:[56 * 56* 64],而输出数据为:[28*28*128],因此,需要将虚线的输出结果输入到前面实现的残差块中,才能最终得到和输入数据相同的shape,从而将输入和输出相加。
在上图中,主分支的stride为2,即可让输入的长宽为[56 * 56* 64]变为[28*28*128],而捷径分支(右侧)的stride为2,也可让输入的长宽为[56 * 56* 64]变为[28*28*128],从而保证主分支执行完两次卷积后再与捷径分支进行相加操作。