keras搬砖系列-inception module
一、1*1 卷积核作用:
1,可以降低通道数
2,减少运算量
如果对于一个28*28*192的初始图像采用的是,5*5*32的卷积核。
则计算量为5*5*192*28*28*32
若采用1*1*32的卷积核
则计算量为192*28*28*32
其次,对于池化来说只能减小宽和高,但是1*1卷积核可以有效的解决通道数目问题。
二、inception module
首先输入一个28*28*192的图片会经历三个一个是(1,1,96),(1,1,16)和一个最大池化层,其中池化层采用padding=same的模式,不会改变图片大小,后面,会经历(5,5,32),(3,3,128),(1,1,64),(1,1,32).具体连接如上。
最后将它们进行concatenate得到一个(28,28,256)。所以inception module整体上降低了计算量,其次也可以采用多个滤波器,用不同的视野对图片进行操作。
三、GoogleNet
对于GoogleNet而言,它主要就是由多个inception module组成的
三、重写GoogleNet
def Conv2d_BN(x,filter,kernel_size,padding='same',strides=(1,1),name=None):
if name is not None:
bn_name = name+'_bn'
conv_name = name+'_conv'
else:
bn_name = None
conv_name = None
x = Conv2D(nb_filter,kernel_size,padding=padding,strides=strides,acitivation='relu',name = conv_name)(x)
x = BatchNormalization(axis=3,name = bn_name)(x)
return x
def inception(x,nb_filter):
branch1x1 = Conv2d_BN(x,nb_filter,(1,1),padding='same',strides=(1,1),name=None)
branch3x3 = Conv2d_BN(x,nb_filter,(1,1),padding='same',strides=(1,1),name=None)
branch3x3 = Conv2d_BN(branch3x3,nb_filter,(3,3),padding='same',strides=(1,1),name=None)
branch5x5 = Conv2d_BN(x,nb_filter,(1,1),padding='same',strides=(1,1),name=None)
branch5x5 = Conv2d_BN(branch5x5,nb_filter,(5,5),padding='same',strides=(1,1),name=None)
branchpool = MaxPooling2D(pool_size=(3,3),strides=(1,1),padding='same')(x)
branchpool = Conv2d_BN(branchpool,nb_filter,(1,1),padding='same',strides=(1,1),name=None)
x = concatenate([branch1x1,branch3x3,branch5x5,branchpool],axis=3)
return x