-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsqueezeNet.py
101 lines (82 loc) · 3.84 KB
/
squeezeNet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from keras.models import Model
from keras.layers import Input, Activation, Concatenate
from keras.layers import Dropout
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import GlobalAveragePooling2D
from keras import regularizers
def fire_module(input_fire, s1, e1, e3, weight_decay_l2, fireID):
'''
A wrapper to build fire module
# Arguments
input_fire: input activations
s1: number of filters for squeeze step
e1: number of filters for 1x1 expansion step
e3: number of filters for 3x3 expansion step
weight_decay_l2: weight decay for conv layers
fireID: ID for the module
# Return
Output activations
'''
# Squezee step
output_squeeze = Convolution2D(
s1, (1, 1), activation='relu',
kernel_initializer='glorot_uniform',
kernel_regularizer=regularizers.l2(weight_decay_l2),
padding='same', name='fire' + str(fireID) + '_squeeze',
data_format="channels_last")(input_fire)
# Expansion steps
output_expand1 = Convolution2D(
e1, (1, 1), activation='relu',
kernel_initializer='glorot_uniform',
kernel_regularizer=regularizers.l2(weight_decay_l2),
padding='same', name='fire' + str(fireID) + '_expand1',
data_format="channels_last")(output_squeeze)
output_expand2 = Convolution2D(
e3, (3, 3), activation='relu',
kernel_initializer='glorot_uniform',
kernel_regularizer=regularizers.l2(weight_decay_l2),
padding='same', name='fire' + str(fireID) + '_expand2',
data_format="channels_last")(output_squeeze)
# Merge expanded activations
output_fire = Concatenate(axis=3)([output_expand1, output_expand2])
return output_fire
def SqueezeNet(num_classes, weight_decay_l2=0.0001, inputs=(128, 128, 3)):
'''
A wrapper to build SqueezeNet Model
# Arguments
num_classes: number of classes defined for classification task
weight_decay_l2: weight decay for conv layers
inputs: input image dimensions
# Return
A SqueezeNet Keras Model
'''
input_img = Input(shape=inputs)
conv1 = Convolution2D(
32, (7, 7), activation='relu', kernel_initializer='glorot_uniform',
strides=(2, 2), padding='same', name='conv1',
data_format="channels_last")(input_img)
maxpool1 = MaxPooling2D(
pool_size=(2, 2), strides=(2, 2), name='maxpool1',
data_format="channels_last")(conv1)
fire2 = fire_module(maxpool1, 8, 16, 16, weight_decay_l2, 2)
fire3 = fire_module(fire2, 8, 16, 16, weight_decay_l2, 3)
fire4 = fire_module(fire3, 16, 32, 32, weight_decay_l2, 4)
maxpool4 = MaxPooling2D(
pool_size=(2, 2), strides=(2, 2), name='maxpool4',
data_format="channels_last")(fire4)
fire5 = fire_module(maxpool4, 16, 32, 32, weight_decay_l2, 5)
fire6 = fire_module(fire5, 32, 64, 64, weight_decay_l2, 6)
fire7 = fire_module(fire6, 32, 64, 64, weight_decay_l2, 7)
fire8 = fire_module(fire7, 64, 128, 128, weight_decay_l2, 8)
maxpool8 = MaxPooling2D(
pool_size=(2, 2), strides=(2, 2), name='maxpool8',
data_format="channels_last")(fire8)
fire9 = fire_module(maxpool8, 64, 128, 128, weight_decay_l2, 9)
fire9_dropout = Dropout(0.5, name='fire9_dropout')(fire9)
conv10 = Convolution2D(
num_classes, (1, 1), activation='relu', kernel_initializer='glorot_uniform',
padding='valid', name='conv10',
data_format="channels_last")(fire9_dropout)
global_avgpool10 = GlobalAveragePooling2D(data_format='channels_last')(conv10)
softmax = Activation("softmax", name='softmax')(global_avgpool10)
return Model(inputs=input_img, outputs=softmax)