GoogleNet inception-v4概述及python实现方法

在复现论文的时候发现需要用谷歌的inception-v4先提取出物体的特征,网上找了一圈也没有现成的,所以就打算自己实现一下。这里实现的是论文中的pure inception blocks。

inception-v4主体就是论文中的figure 9,然后figure 3,4,5,6,7,8分别是对主体中每层细节的展开。从图中可以看到,每层中用到的操作都是卷积,池化和filter_concat,所以在实现上还是比较好实现的。

选择keras是为了快速复现这一论文,keras更加抽象,相较于tensorflow是一个更高层的神经网络API。这里我们用的keras后端是tensorflow-gpu。下面就开始具体的实现步骤。

首先定义卷积函数:

def conv(input, n_filter, row, col, strides=(1,1), 
    padding='same', bias=False):
    x = Convolution2D(n_filter, [row,col],strides=strides,  
        padding=padding, use_bias=bias)(input)
    x = BatchNormalization(axis=channel_axis)(x)
    x = Activation('relu')(x)

这个函数实现了figure3-8中每一小块的卷积功能,用的是keras里函数式模型。
Convolution2D中n_filter指卷积核的个数,[row,col]是卷积核的大小,strides是滑动步长,padding为same时则输出矩阵尺寸与输入相同,为valid时不同,use_bias是是否选择偏置项,这里选择否。偏置就是w*x+b里的b。
BatchNormalization也就是BN层,关于BN层的作用有如下4个:1.加速收敛;2.控制过拟合,可以少用或不用Dropout和正则;3.降低网络对初始化权重不敏感;4.允许使用较大的学习率。具体的参考文献是Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift。这里按channel_axis=-1。
Activation中使用relu激活,激活函数就不做过多的解释了。

现在已经完成了图中的小格,剩下的任务就是将小格拼起来,这里只列出figure9中stem的代码:

def stem(input):
    x = conv(input, 32, 3, 3, strides=(2,2), padding='valid')
    x = conv(x, 32, 3, 3, padding='valid')
    x = conv(x, 64, 3, 3,)

    x1 = MaxPooling2D((3,3), strides=(2,2), padding='valid')(x)
    x2 = conv(x, 96, 3, 3, strides=(2,2), padding='valid')
    x = merge([x1,x2], mode='concat', concat_axis=channel_axis)

    return x

这里需要注意的是merge时使用图中concat方法,这是将几个同shape的张量合成为向量。这块的函数和官方文档的不太一样,应该是版本的问题。具体的mode有
“sum”,”mul”,”concat”,”ave”,”cos”,”dot”,可以对照文档上对应的函数使用。

下一篇文章将使用inception-v4进行训练。

你可能感兴趣的:(keras)