使用TensorFlow实现Inception-V3神经网络

上一讲我们讲述了Inception-V3卷积神经网络的基本模型及其实现原理,这一节我们将使用TensorFlow去实现Inception-V3这个卷积神经网络。使用TensorFlow实现Inception-V3卷积神经网络,InceptionModule将不同的卷积层通过并行连接的方式结合在一起。同时使用所有不同尺寸的过滤器,然后再将得到的矩阵拼接起来。如下图,Inception V3 模型总共有 46 层 ,由 11 个Inception模块组成。仔细数一数就会发现在Inception-V3 模型中有 96 个卷积层,如果还像实现VGGNet和AlexNet时那样使用conv2d()函数创建卷积层,那么将产生冗长的代码。

使用TensorFlow实现Inception-V3神经网络
针对上述问题,TensorFlow 提供了 Slim 工具来更加简捷地实现一个卷积层。在熟悉了使用一般的卷积函数创建卷积层之后,我们现在介绍一下该工具介绍以及这个工具的使用。下面以 Inception V3 的最后一个 Module 为例,通过 Slim工具来完成对它的创建。tensorflow官方对它的描述是:此目录中的任何代码未经官方支持,可能会随时更改或删除。每个目录下都有指定的所有者。它旨在包含额外功能和贡献,最终会合并到核心TensorFlow中,但其接口可能仍然会发生变化,或者需要进行一些测试,看是否可以获得更广泛的接受。所以slim依然不属于原生tensorflow。slim是一个使构建,训练,评估神经网络变得简单的库。它可以消除原生tensorflow里面很多重复的模板性的代码,让代码更紧凑,更具有可读性。另外slim提供了很多计算机视觉方面的著名模型(VGG, AlexNet等),我们不仅可以直接去使用,而已还能以其他的各种方式进行扩展。Slim 可以通过导入路径tensorflow/contrib/slim/的方式得到 。Slim 工具中的 srg_scope()函数可用于设置默认的参数值。slim.srg_scope()函数的第一个参数是需要提供默认值的函数,通常会被写为列表的形式,在这个列表中的函数将使用默认的参数值。在Slim工具中,同样也封装了构建卷积层与池化层的一些函数。在下面的程序中,我们将会用到的是 slim.conv2d() 函数、 slim. max_pool2d()函数和slim.avg_pool2d()函数,它们的使用方法几乎和之前介绍的那些函数无异。在执行卷积和池化操作时,一般都会设置stride=1和padding=”SAME”,而这些取值相同的参数可以放到srg_scope()函数中进行声明。比如,在代码中对srg_scope()函数声明了stride=1和padding=”SAME”,那么在接下来调用slim.conv2d(last_net,320,[1,1])函数时指定了stride参数和padding参数,那么通过srg_scope()函数设置的默认值就不会再使用。这种使用 Slim 工具的方式可以进一步减小冗余的代码。下面的程序展示了 Inception- v3 的最后一个 Module 的实现(关于实现拼接操作的 concat()函数的使用方法,也可以参考这段代码):

使用TensorFlow实现Inception-V3神经网络
从上面这段程序可以看出,使用 Slim 工具构建的网络层同样比较清晰,而且代码量也不算太多。读者可以尝试着使用之前介绍的方法也搭建一个 Inception-v3的最后一个Module,对比一下使用何种方式更方便,代码量更小。总结:这一节我们使用TensorFlow里面的Slim工具去构建Inception-V3网络模型,该工具可以大大减少我们的代码量。

关注小鲸融创,一起深度学习金融科技!

使用TensorFlow实现Inception-V3神经网络