TensorFlow实现ResNet

这篇博客详细介绍了如何使用TensorFlow构建ResNet网络。首先,定义了Basic_Block类,包括__init__和call方法,实现了ResNet的基本结构,包括卷积、标准化、ReLU操作以及短接连接。接着,定义了Resnet类,包含build_block方法用于构建网络模块,__init__方法中初始化了数据并设置了网络结构。call方法则按照网络流程调用各个层。博客最后展示了如何根据需要的层数构建ResNet18或ResNet34等模型。

目录

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值