目录
1.概述
通过tensorflow实现ResNet,需要先定义最小模块basic_block,在其中实现最基本的ResNet前向传播以及短接功能;之后定义ResNet模块,通过堆叠不同个数的basic_block,并拼接到一起,实现ResNet的功能实现。
2.Basic_Block
① __init__
在这里面定义好需要使用的层。
根据ResNet的原理,流程如下:卷积层--BatchNormalize--relu--卷积层--BatchNormalize,之后将输出与输入element-wise相加。
因此需要定义卷积层1、标准化层1、RELU层、卷积层2、标准化层2
还需要定义一个方法,在输出与输出维度不等的时候,把输入变成和输出相等的维度。

②call
在这里按照流程调用上面定义的层即可。
在最后输入输出相加。

3.Resnet
①build_block
定义类中的方法,用来搭建我们需要的ResNet模块。
搭建模块需要调用上面的BasicBlock, 模块的数量可以由我们自定义,因此作为变量输入。
第一个模块,可以进行图片大小的改变,比如[2,32,32,3] -->[2,16,16,64],大小变成了16*16。
之后的模块,大小不变,因此stride参数固定为1。
BasicBlock中的通道数量我们自己定义,因此也作为变量输入。

②__init__
这里面定义需要使用的层。
首先需要对数据初始化,将输入的数据先进行一次卷积+标准化+非线性+池化,变成通道数为64的数据(这个64也是自己定的),对应好了通道数,后面就可以根据通道数定义网络的层了。
输入的层的维度如果是[2,2,2,2],就相当于搭建4个残差网络层,其中每一个层中间有2个基本模块。
最后一个层输出后,图片的长宽我们并不知道,因此通过GlobalAveragePooling2D层来得到。
最后定义一个线性层,转为最终的预测的维度。这里我设为了100维。

③call
根据上面的流程依次调用层即可。

当设置好了以后,直接输入层的维度,即可实现ResNet18,ResNet34等:
