深度学习·神经网络·计算机视觉

2.1 SqueezeNet V1思考

2019-04-16  本文已影响3人  深度学习模型优化

SqueezeNet知乎文章

1 动机

         我们的目标是

         主要从两个方向来优化模型设计:

这么做的优点有:

2 SqueezeNet分析

模型优化策略:

SqueezeNet的核心模块是Fire模块,其由Squeeze部分和Expand部分组成。如下图所示。


图1 Fire模块
def fire(x, s_1x1, e_1x1, e_3x3, fire_name):
  # squeeze part
  squeeze_x = Conv2D(kernel_size = (1, 1), filters = s_1x1, padding='same', activation='relu', name = fire_name + '_s1')(x)
  # expand part
  expand_x_1 = Conv2D(kernel_size = (1, 1), filter = e_1x1, padding = 'same', activation='relu', name = fire_name + '_e1')(squeeze_x)
  expand_x_3 = Conv2D(kernel_size = (3,3), filter = e_3x3, padding = 'same', activation = 'relu', name = fire_name + '_e3')(squeeze_x)
  expand = merge([expand_x_1, expand_x_3], mode = 'concat', concat_axis=3)
  return expand
图2 SqueezeNet的典型示例
         图2中输入特征图个数为96,,输出特征图的个数为128,一般来说特征图个数为64或者128就能保证网络的表示能力已经不错了,后面就是要注意寻优的工作。

3 SqueezeNet的一些结构

在fire模块组合设计中有一些原则:

图3 SqueezeNet网络结构

下面代码是keras的简单实现

def SqueezeNet(x):
  conv1 = Conv2D(input_shape=(224, 224, 3), stride=2, filter=96, kernel_size=(7, 7), padding='same', activation='relu')(x)
  pool1 = MaxPool2D((2, 2))(conv1)
  fire2 = fire(pool1, 16, 64, 64, 'fire2')
  fire3 = fire(fire2, 16, 64, 64, 'fire3')
  fire4 = fire(fire3, 32, 128, 128, 'fire4')
  pool2 = MaxPool2D((2, 2))(fire4)
  fire5 = fire(pool2, 32, 128, 128, 'fire5')
  fire6 = fire(fire5, 48, 192, 192, 'fire6')
  fire7 = fire(fire6, 48, 192, 192, 'fire7')
  fire8 = fire(fire7, 64, 256, 256, 'fire8')
  pool3 = MaxPool2D((2, 2))(fire8)
  fire9 = fire(pool3, 64, 256, 256, 'fire9')
  dropout1 = Dropout(0.5)(fire9)
  conv10 = Conv2D(kernel_size=(1, 1), filters = 1000, padding='same', activation='relu')(dropout1)
  gap = GlobalAveragePooling2D()(conv10)
  return gap

最后将结果送入softmax分类器进行分类即可。当然也可以使用迁移学习的方法来做。

4 SqueezeNet的缺点

上一篇 下一篇

猜你喜欢

热点阅读