一、前言
作者在学习Resnet相关内容的时候,被导师提出了一个要求:对于Resnet50的网络,从数据的角度来研究和分享。具体要求是对于一张图片,要能确切的写出在整个过程中的维度变化。接下了这个任务,我在优快云上找了很久没有发现合适的图片,遂自己使用notability研究清楚了做出了一张图,希望能对大家有所帮助。
废话不多说,上图。
二、Resnet50的框架结构图(附维度数据变化过程)
Resnet50的详细结构图
1.详细分析解释:
- 输入的图片按照224*224*3的彩色图片来预设,上图中的黄色部分就是在每一步处理之前得到的维度结果,其中第一个维度一般表示channel数量,后面两个数字代表的是对应的每一个矩阵的长宽。
- 上图中的conv实际上是CBL的一整套操作,具体是convolution,batch normalization和ReLU操作的一个结合,但是由于后面这两个操作BN层用来归一化而ReLU函数激活,不会影响输入输出数据的维度,所以上面将这两者进行结合,只使用CBL来统一概括。其中s加上数字表示stride具体是多少。
- 上面之中的avg-pool对应的是平均池化层,而max-pool对应的是最大池化层。
- 正如图上所写的一样,从Stage5-6这一层中间,使用的是展平操作,其具体对应的函数用的是view函数:
x = x.view(x.size(0), -1)
位置:Resnet类的forward函数之中。
- 对于中间的几个Layer,其对应的就是Resnet50用来对抗梯度消失和梯度爆炸的方式:残差块,接下来我就会详细的讲讲这块的具体数据流转的方式。其中的次数的t1,t2,t3,t4分别对应着每一个Bottleneck残差块堆叠的个数,比如Resnet50的堆叠次数就是3,4,6,3
def resnet50(num_classes=1000): return ResNet(Bottleneck, [3, 4, 6, 3], num_classes=num_classes)
2.Bottleneck部分的信息详解
那么对于残差块中的数据变化情况是什么样的呢?上图:
解析:
1.上面的红色表示模型相关的参数变动或者操作相关;
黄色标识的是经过每一步操作之后输出结果的维度;
绿色部分是ReLU的激活函数;
紫色部分是残差相加的具体体现;
蓝色部分是用以强调第一个Bottleneck块和第二个以及之后所有的的具体差别,从图中就可以看出就是中间的卷积层的stride发生了变化。
2.输入的参数有两个,一个是planes,一个是stride。通过调整planes的结果可以控制输出的内容的通道数,在Bottleneck部分使用M来表示。stride会影响第一个Bottleneck块中中间的3x3的卷积的stride的值,上图中用n来表示这个参数。
3.为了适应不同的层对应的不同的维度的输入,在上面的图中,将Channel数使用大写的C来表示,而对于图片的尺寸使用S来表示。
4.实际上从结果上考虑更多采用的n都是2,使得图片可以一次操作之后channel数量*2而size的数值/2
三、后记
作者第一次被导师布置任务的时候只有一个词语:Resnet,至于应该怎么去研究是我去询问导师之后得知的。作为刚刚接触相关内容的朋友们来说,了解结构如何思想是怎样的比较简单,但是像本文一样能梳理一下数据究竟经过了怎么样的一个过程得以输出的很有助于对于整个Resnet内容的理解和之后具体的修改。希望本文能作为一个很好的助手帮助各位朋友对于Resnet50有着全新的认知。
都看到这里了不点个赞关注一下嘛awa55555