TensorFlow实现ResNet

目录

1.概述

2.Basic_Block

① __init__

 ②call

3.Resnet

①build_block

②__init__

③call


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等:


版权声明:本文为Swayzzu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。