tensorflow下实现ResNet网络对数据集cifar-10的图像分类

Inceptionv3传送门:Inceptionv3

DenseNet传送门:DenseNet

SegNet传送门:semantic segmentation-segnet

ResNet论文地址:https://arxiv.org/pdf/1512.03385.pdf

先来简单讲讲ResNet的网络结构。ResNet的出现是为了解决深度网络中由于层数太多,导致的degradation problem(退化问题),作者在原论文中对比了较为“耿直”的深度卷积网络(例如以VGG为原型,不断加深层数)在不同层数的训练精度:

tensorflow下实现ResNet网络对数据集cifar-10的图像分类

从图中可见,18层的卷积结构反而要比34层的准确率要高,这就是所谓的degradation problem。而ResNet提出了一种比较新颖的解决方法,即identity mapping:在常用的卷积结构中加入一个shortcut connection(捷径)。如下图所示:

tensorflow下实现ResNet网络对数据集cifar-10的图像分类

以上图为例,对于一个input,对其做两层卷积操作(包含BN,RELU),在输出端加上卷积操作之前的数值。这里得到的输出作为后续卷积层的输入。这样一个操作便构成了Residual module。

其效果也很显著,相比未加入residual结构的卷积网络,其准确率是随着层数加深而增加的,如下图所示:

tensorflow下实现ResNet网络对数据集cifar-10的图像分类

其中作者在论文中还介绍了一些ResNet的结构变化,比如卷积核的改变:

tensorflow下实现ResNet网络对数据集cifar-10的图像分类

以及相应的ResNet A(在shortcut connection的部分为了使维度一致,仅使用zero-padding,不加任何训练参数), ResNet B(仅在需要使维度一致的情况下使用权值参数W计算Wx得到与输出一致的维度), ResNet C(在每一个shortcut connection均使用权值参数W对shortcut connection的输入进行训练)。不过C版的参数量相较于B版较大,且并没有较大的提升效果,并不推荐使用。

而在进行cifar10的数据集训练的时候,我这里使用的是A版,即不带参数训练的shortcut connection。网络的输入是32x32的图片,并且经过预处理对所有点减去平均值。第一层为一个3x3的卷积层。之后一共有6n个3x3的卷积层,其中对于为{32,16,8}的features maps分别为2n个卷积层。残差网络最后接一个全局的平均池化,以及一个10类的全连接。如果想修改成其他的网络结构(如resnet_56),只需要修改residual_blocks中的n参数即可。

其模型结构部分代码如下所示:

tensorflow下实现ResNet网络对数据集cifar-10的图像分类

其代码下载地址:Architecture        其中包含一个之前写好的inceptionv3 和一个正在写的DenseNet.