D:\pythonCodes\深度学习实验\经典分类网络\6:ResNet\resnet手动实现实验
一、ResNet网络模型详解
1.1 整体结构
可以看到,resnet34主要就是由layer1-4组成。而这4个layer分别就是由3、4、6、3个BasicBlock堆叠而成。
BasicBlock有两种:
右边虚线的BasicBlock主要用在layer2-4的第一块。作用就是要保证主分支和shortcut的输出特征shape相同。
说明:resnet18/34使用的是BasicBlock堆叠,而resnet50/101/152使用的是Bottleneck进行堆叠。
1.2 详细介绍
前面:
输入图片尺寸:224*224*3
conv1:
输入通道是3,输出通道是64。kernel_size=7,stride=2,padding=3。输出尺寸为(224-7+6)/2 + 1 = 112.5下取整 = 112。 所以输出64*112*112
bn1、relu:
在UNet中是conv、ReLu、BN,在FusionNet中是conv、BN、ReLu。应该是都行。而且是标配动作。我们不管了。
maxpool:
kernel_size=3,stride=2, padding=1。不改变通道数。输出尺寸为(112-3+2)/2 + 1 = 56.5下取整=56。所以输出64*56*56。
layer1:
也就是经过了以下的三个BasicBlock:
主分支上,首先 经过3*3*64的卷积层。stride=1,padding=1。输出尺寸(56+2-3)/1 + 1 = 56。所以输出56*56*64。经过第二个卷积层完全一样,输出还是64*56*56。
主分支与捷径上都是56*56*64,进行相加操作,然后经过relu,还是64*56*56。
经过剩下的两个BasicBlock,还是一样。输出还是64*56*56。
layer2:
layer2中的第一个BasicBlock与其他三个不同,是带downsample的。也就是走的是虚线的那种。具体为:
主分支:首先经过3*3*128的卷积层。stride=2,padding =1。输出尺寸(56+2-3)/2 +1 = 28.5下取整=28。所以输出尺寸128*28*28。
然后经过3*3*128的卷积层。stride=1,padding=1。输出尺寸(28+2-3)/1+1 = 28。所以输出128*28*28。
捷径:经过1*1*128的卷积层。stride=2,padding=0。输出尺寸(56-1)/2 +1 = 28。输出为128*28*28。
主分支和捷径的结果shape相同,所以可以相加。结果为128*28*28。
然后剩下的三个走的都是不带downsample的那种了。即:
主分支