# SqueezeNet architecture for image classification on ImageNet dataset
name: "SqueezeNet"

layer {
   name: "ImageNet"
   type: "Data"
   top: "data"
   top: "label"
   transform_param {
      crop_size: 227
      mean_value: 104
      mean_value: 117
      mean_value: 123
   }
   data_param {
      source: "ImageNet_train_lmdb"
      batch_size: 64
      backend: LMDB
   }
   include {
      phase: TRAIN
   }
}
layer {
   name: "ImageNet"
   type: "Data"
   top: "data"
   top: "label"
   transform_param {
      crop_size: 227
      mean_value: 104
      mean_value: 117
      mean_value: 123
   }
   data_param {
      source: "ImageNet_val_lmdb"
      batch_size: 5
      backend: LMDB
   }
   include {
      phase: TEST
   }
}
layer {
   name: "conv1"
   type: "Convolution"
   bottom: "data"
   top: "conv1"
   convolution_param {
      num_output: 96
      kernel_size: 7
      stride: 2
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_conv1"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "conv1"
   top: "conv1"
}
layer {
   name: "pool1"
   type: "Pooling"
   bottom: "conv1"
   top: "pool1"
   pooling_param {
      pool: MAX
      kernel_size: 3
      stride: 2
   }
}

layer {
   name: "fire2_squeeze"
   type: "Convolution"
   bottom: "pool1"
   top: "fire2_squeeze"
   convolution_param {
      num_output: 16
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire2_squeeze"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire2_squeeze"
   top: "fire2_squeeze"
}
layer {
   name: "fire2_expand_1x1"
   type: "Convolution"
   bottom: "fire2_squeeze"
   top: "fire2_expand_1x1"
   convolution_param {
      num_output: 64
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire2_expand_1x1"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire2_expand_1x1"
   top: "fire2_expand_1x1"
}
layer {
   name: "fire2_expand_3x3"
   type: "Convolution"
   bottom: "fire2_squeeze"
   top: "fire2_expand_3x3"
   convolution_param {
      num_output: 64
      kernel_size: 3
      stride: 1
      pad: 1
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire2_expand_3x3"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire2_expand_3x3"
   top: "fire2_expand_3x3"
}
layer {
   name: "fire2"
   type: "Concat"
   bottom: "fire2_expand_1x1"
   bottom: "fire2_expand_3x3"
   top: "fire2"
   concat_param {
      axis: 1
   }
}

layer {
   name: "fire3_squeeze"
   type: "Convolution"
   bottom: "fire2"
   top: "fire3_squeeze"
   convolution_param {
      num_output: 16
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire3_squeeze"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire3_squeeze"
   top: "fire3_squeeze"
}
layer {
   name: "fire3_expand_1x1"
   type: "Convolution"
   bottom: "fire3_squeeze"
   top: "fire3_expand_1x1"
   convolution_param {
      num_output: 64
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire3_expand_1x1"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire3_expand_1x1"
   top: "fire3_expand_1x1"
}
layer {
   name: "fire3_expand_3x3"
   type: "Convolution"
   bottom: "fire3_squeeze"
   top: "fire3_expand_3x3"
   convolution_param {
      num_output: 64
      kernel_size: 3
      stride: 1
      pad: 1
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire3_expand_3x3"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire3_expand_3x3"
   top: "fire3_expand_3x3"
}
layer {
   name: "fire3"
   type: "Concat"
   bottom: "fire3_expand_1x1"
   bottom: "fire3_expand_3x3"
   top: "fire3"
   concat_param {
      axis: 1
   }
}

layer {
   name: "fire4_squeeze"
   type: "Convolution"
   bottom: "fire3"
   top: "fire4_squeeze"
   convolution_param {
      num_output: 32
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire4_squeeze"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire4_squeeze"
   top: "fire4_squeeze"
}
layer {
   name: "fire4_expand_1x1"
   type: "Convolution"
   bottom: "fire4_squeeze"
   top: "fire4_expand_1x1"
   convolution_param {
      num_output: 128
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire4_expand_1x1"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire4_expand_1x1"
   top: "fire4_expand_1x1"
}
layer {
   name: "fire4_expand_3x3"
   type: "Convolution"
   bottom: "fire4_squeeze"
   top: "fire4_expand_3x3"
   convolution_param {
      num_output: 128
      kernel_size: 3
      stride: 1
      pad: 1
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire4_expand_3x3"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire4_expand_3x3"
   top: "fire4_expand_3x3"
}
layer {
   name: "fire4"
   type: "Concat"
   bottom: "fire4_expand_1x1"
   bottom: "fire4_expand_3x3"
   top: "fire4"
   concat_param {
      axis: 1
   }
}
layer {
   name: "pool4"
   type: "Pooling"
   bottom: "fire4"
   top: "pool4"
   pooling_param {
      pool: MAX
      kernel_size: 3
      stride: 2
   }
}
layer {
   name: "fire5_squeeze"
   type: "Convolution"
   bottom: "pool4"
   top: "fire5_squeeze"
   convolution_param {
      num_output: 32
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire5_squeeze"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire5_squeeze"
   top: "fire5_squeeze"
}
layer {
   name: "fire5_expand_1x1"
   type: "Convolution"
   bottom: "fire5_squeeze"
   top: "fire5_expand_1x1"
   convolution_param {
      num_output: 128
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire5_expand_1x1"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire5_expand_1x1"
   top: "fire5_expand_1x1"
}
layer {
   name: "fire5_expand_3x3"
   type: "Convolution"
   bottom: "fire5_squeeze"
   top: "fire5_expand_3x3"
   convolution_param {
      num_output: 128
      kernel_size: 3
      stride: 1
      pad: 1
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire5_expand_3x3"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire5_expand_3x3"
   top: "fire5_expand_3x3"
}
layer {
   name: "fire5"
   type: "Concat"
   bottom: "fire5_expand_1x1"
   bottom: "fire5_expand_3x3"
   top: "fire5"
   concat_param {
      axis: 1
   }
}
layer {
   name: "fire6_squeeze"
   type: "Convolution"
   bottom: "fire5"
   top: "fire6_squeeze"
   convolution_param {
      num_output: 48
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire6_squeeze"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire6_squeeze"
   top: "fire6_squeeze"
}
layer {
   name: "fire6_expand_1x1"
   type: "Convolution"
   bottom: "fire6_squeeze"
   top: "fire6_expand_1x1"
   convolution_param {
      num_output: 192
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire6_expand_1x1"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire6_expand_1x1"
   top: "fire6_expand_1x1"
}
layer {
   name: "fire6_expand_3x3"
   type: "Convolution"
   bottom: "fire6_squeeze"
   top: "fire6_expand_3x3"
   convolution_param {
      num_output: 192
      kernel_size: 3
      stride: 1
      pad: 1
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire6_expand_3x3"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire6_expand_3x3"
   top: "fire6_expand_3x3"
}
layer {
   name: "fire6"
   type: "Concat"
   bottom: "fire6_expand_1x1"
   bottom: "fire6_expand_3x3"
   top: "fire6"
   concat_param {
      axis: 1
   }
}
layer {
   name: "fire7_squeeze"
   type: "Convolution"
   bottom: "fire6"
   top: "fire7_squeeze"
   convolution_param {
      num_output: 48
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire7_squeeze"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire7_squeeze"
   top: "fire7_squeeze"
}
layer {
   name: "fire7_expand_1x1"
   type: "Convolution"
   bottom: "fire7_squeeze"
   top: "fire7_expand_1x1"
   convolution_param {
      num_output: 192
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire7_expand_1x1"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire7_expand_1x1"
   top: "fire7_expand_1x1"
}
layer {
   name: "fire7_expand_3x3"
   type: "Convolution"
   bottom: "fire7_squeeze"
   top: "fire7_expand_3x3"
   convolution_param {
      num_output: 192
      kernel_size: 3
      stride: 1
      pad: 1
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire7_expand_3x3"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire7_expand_3x3"
   top: "fire7_expand_3x3"
}
layer {
   name: "fire7"
   type: "Concat"
   bottom: "fire7_expand_1x1"
   bottom: "fire7_expand_3x3"
   top: "fire7"
   concat_param {
      axis: 1
   }
}
layer {
   name: "fire8_squeeze"
   type: "Convolution"
   bottom: "fire7"
   top: "fire8_squeeze"
   convolution_param {
      num_output: 64
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire8_squeeze"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire8_squeeze"
   top: "fire8_squeeze"
}
layer {
   name: "fire8_expand_1x1"
   type: "Convolution"
   bottom: "fire8_squeeze"
   top: "fire8_expand_1x1"
   convolution_param {
      num_output: 256
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire8_expand_1x1"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire8_expand_1x1"
   top: "fire8_expand_1x1"
}
layer {
   name: "fire8_expand_3x3"
   type: "Convolution"
   bottom: "fire8_squeeze"
   top: "fire8_expand_3x3"
   convolution_param {
      num_output: 256
      kernel_size: 3
      stride: 1
      pad: 1
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire8_expand_3x3"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire8_expand_3x3"
   top: "fire8_expand_3x3"
}
layer {
   name: "fire8"
   type: "Concat"
   bottom: "fire8_expand_1x1"
   bottom: "fire8_expand_3x3"
   top: "fire8"
   concat_param {
      axis: 1
   }
}
layer {
   name: "pool8"
   type: "Pooling"
   bottom: "fire8"
   top: "pool8"
   pooling_param {
      pool: MAX
      kernel_size: 3
      stride: 2
   }
}
layer {
   name: "fire9_squeeze"
   type: "Convolution"
   bottom: "pool8"
   top: "fire9_squeeze"
   convolution_param {
      num_output: 64
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire9_squeeze"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire9_squeeze"
   top: "fire9_squeeze"
}
layer {
   name: "fire9_expand_1x1"
   type: "Convolution"
   bottom: "fire9_squeeze"
   top: "fire9_expand_1x1"
   convolution_param {
      num_output: 256
      kernel_size: 1
      stride: 1
      pad: 0
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire9_expand_1x1"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire9_expand_1x1"
   top: "fire9_expand_1x1"
}
layer {
   name: "fire9_expand_3x3"
   type: "Convolution"
   bottom: "fire9_squeeze"
   top: "fire9_expand_3x3"
   convolution_param {
      num_output: 256
      kernel_size: 3
      stride: 1
      pad: 1
      weight_filler {
         type: "xavier"
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_fire9_expand_3x3"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "fire9_expand_3x3"
   top: "fire9_expand_3x3"
}
layer {
   name: "fire9"
   type: "Concat"
   bottom: "fire9_expand_1x1"
   bottom: "fire9_expand_3x3"
   top: "fire9"
   concat_param {
      axis: 1
   }
}
layer {
   name: "conv10"
   type: "Convolution"
   bottom: "fire9"
   top: "conv10"
   convolution_param {
      num_output: 1000
      kernel_size: 1
      stride: 1
      weight_filler {
         type: "gaussian"
         mean: 0.0
         std: 0.01
      }
      bias_filler {
         type: "constant"
         value: 0.01
      }
   }
}
layer {
   name: "rect_conv10"
   type: "ReLU"
   relu_param {
      negative_slope: 0.01
   }
   bottom: "conv10"
   top: "conv10"
}
layer {
   name: "pool10"
   type: "Pooling"
   bottom: "conv10"
   top: "pool10"
   pooling_param {
      pool: AVE
      global_pooling: true
   }
}
layer {
   name: "loss"
   type: "SoftmaxWithLoss"
   bottom: "pool10"
   bottom: "label"
   top: "loss"
   include {
      phase: TRAIN
   }
}
layer {
   name: "accuracy"
   type: "Accuracy"
   bottom: "pool10"
   bottom: "label"
   top: "accuracy"
}
layer {
   name: "accuracy_top_5"
   type: "Accuracy"
   bottom: "pool10"
   bottom: "label"
   top: "accuracy_top_5"
   include {
      phase: TEST
   }
   accuracy_param {
      top_k: 5
   }
}
