@@ -0,0 +1,269 @@
from scipy .misc import imread , imresize
from keras .layers import Input , Dense , Convolution2D , MaxPooling2D , AveragePooling2D , ZeroPadding2D , BatchNormalization , Dropout , Flatten , Lambda , merge , Reshape , Activation
from keras .models import Model
from keras .regularizers import l2
from keras .optimizers import SGD
from custom_layers import PoolHelper ,LRN
def create_googlenet (weights_path = None ):
# creates GoogLeNet a.k.a. Inception v1 (Szegedy, 2014)
input = Input (shape = (3 , 224 , 224 ))
conv1_7x7_s2 = Convolution2D (64 ,7 ,7 ,subsample = (2 ,2 ),border_mode = 'same' ,activation = 'relu' ,name = 'conv1/7x7_s2' ,W_regularizer = l2 (0.0002 ))(input )
conv1_zero_pad = ZeroPadding2D (padding = (1 , 1 ))(conv1_7x7_s2 )
pool1_helper = PoolHelper ()(conv1_zero_pad )
pool1_3x3_s2 = MaxPooling2D (pool_size = (3 ,3 ),strides = (2 ,2 ),border_mode = 'valid' ,name = 'pool1/3x3_s2' )(pool1_helper )
pool1_norm1 = LRN (name = 'pool1/norm1' )(pool1_3x3_s2 )
conv2_3x3_reduce = Convolution2D (64 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'conv2/3x3_reduce' ,W_regularizer = l2 (0.0002 ))(pool1_norm1 )
conv2_3x3 = Convolution2D (192 ,3 ,3 ,border_mode = 'same' ,activation = 'relu' ,name = 'conv2/3x3' ,W_regularizer = l2 (0.0002 ))(conv2_3x3_reduce )
conv2_norm2 = LRN (name = 'conv2/norm2' )(conv2_3x3 )
conv2_zero_pad = ZeroPadding2D (padding = (1 , 1 ))(conv2_norm2 )
pool2_helper = PoolHelper ()(conv2_zero_pad )
pool2_3x3_s2 = MaxPooling2D (pool_size = (3 ,3 ),strides = (2 ,2 ),border_mode = 'valid' ,name = 'pool2/3x3_s2' )(pool2_helper )
inception_3a_1x1 = Convolution2D (64 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3a/1x1' ,W_regularizer = l2 (0.0002 ))(pool2_3x3_s2 )
inception_3a_3x3_reduce = Convolution2D (96 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3a/3x3_reduce' ,W_regularizer = l2 (0.0002 ))(pool2_3x3_s2 )
inception_3a_3x3 = Convolution2D (128 ,3 ,3 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3a/3x3' ,W_regularizer = l2 (0.0002 ))(inception_3a_3x3_reduce )
inception_3a_5x5_reduce = Convolution2D (16 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3a/5x5_reduce' ,W_regularizer = l2 (0.0002 ))(pool2_3x3_s2 )
inception_3a_5x5 = Convolution2D (32 ,5 ,5 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3a/5x5' ,W_regularizer = l2 (0.0002 ))(inception_3a_5x5_reduce )
inception_3a_pool = MaxPooling2D (pool_size = (3 ,3 ),strides = (1 ,1 ),border_mode = 'same' ,name = 'inception_3a/pool' )(pool2_3x3_s2 )
inception_3a_pool_proj = Convolution2D (32 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3a/pool_proj' ,W_regularizer = l2 (0.0002 ))(inception_3a_pool )
inception_3a_output = merge ([inception_3a_1x1 ,inception_3a_3x3 ,inception_3a_5x5 ,inception_3a_pool_proj ],mode = 'concat' ,concat_axis = 1 ,name = 'inception_3a/output' )
inception_3b_1x1 = Convolution2D (128 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3b/1x1' ,W_regularizer = l2 (0.0002 ))(inception_3a_output )
inception_3b_3x3_reduce = Convolution2D (128 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3b/3x3_reduce' ,W_regularizer = l2 (0.0002 ))(inception_3a_output )
inception_3b_3x3 = Convolution2D (192 ,3 ,3 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3b/3x3' ,W_regularizer = l2 (0.0002 ))(inception_3b_3x3_reduce )
inception_3b_5x5_reduce = Convolution2D (32 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3b/5x5_reduce' ,W_regularizer = l2 (0.0002 ))(inception_3a_output )
inception_3b_5x5 = Convolution2D (96 ,5 ,5 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3b/5x5' ,W_regularizer = l2 (0.0002 ))(inception_3b_5x5_reduce )
inception_3b_pool = MaxPooling2D (pool_size = (3 ,3 ),strides = (1 ,1 ),border_mode = 'same' ,name = 'inception_3b/pool' )(inception_3a_output )
inception_3b_pool_proj = Convolution2D (64 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_3b/pool_proj' ,W_regularizer = l2 (0.0002 ))(inception_3b_pool )
inception_3b_output = merge ([inception_3b_1x1 ,inception_3b_3x3 ,inception_3b_5x5 ,inception_3b_pool_proj ],mode = 'concat' ,concat_axis = 1 ,name = 'inception_3b/output' )
inception_3b_output_zero_pad = ZeroPadding2D (padding = (1 , 1 ))(inception_3b_output )
pool3_helper = PoolHelper ()(inception_3b_output_zero_pad )
pool3_3x3_s2 = MaxPooling2D (pool_size = (3 ,3 ),strides = (2 ,2 ),border_mode = 'valid' ,name = 'pool3/3x3_s2' )(pool3_helper )
inception_4a_1x1 = Convolution2D (192 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4a/1x1' ,W_regularizer = l2 (0.0002 ))(pool3_3x3_s2 )
inception_4a_3x3_reduce = Convolution2D (96 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4a/3x3_reduce' ,W_regularizer = l2 (0.0002 ))(pool3_3x3_s2 )
inception_4a_3x3 = Convolution2D (208 ,3 ,3 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4a/3x3' ,W_regularizer = l2 (0.0002 ))(inception_4a_3x3_reduce )
inception_4a_5x5_reduce = Convolution2D (16 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4a/5x5_reduce' ,W_regularizer = l2 (0.0002 ))(pool3_3x3_s2 )
inception_4a_5x5 = Convolution2D (48 ,5 ,5 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4a/5x5' ,W_regularizer = l2 (0.0002 ))(inception_4a_5x5_reduce )
inception_4a_pool = MaxPooling2D (pool_size = (3 ,3 ),strides = (1 ,1 ),border_mode = 'same' ,name = 'inception_4a/pool' )(pool3_3x3_s2 )
inception_4a_pool_proj = Convolution2D (64 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4a/pool_proj' ,W_regularizer = l2 (0.0002 ))(inception_4a_pool )
inception_4a_output = merge ([inception_4a_1x1 ,inception_4a_3x3 ,inception_4a_5x5 ,inception_4a_pool_proj ],mode = 'concat' ,concat_axis = 1 ,name = 'inception_4a/output' )
loss1_ave_pool = AveragePooling2D (pool_size = (5 ,5 ),strides = (3 ,3 ),name = 'loss1/ave_pool' )(inception_4a_output )
loss1_conv = Convolution2D (128 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'loss1/conv' ,W_regularizer = l2 (0.0002 ))(loss1_ave_pool )
loss1_flat = Flatten ()(loss1_conv )
loss1_fc = Dense (1024 ,activation = 'relu' ,name = 'loss1/fc' ,W_regularizer = l2 (0.0002 ))(loss1_flat )
loss1_drop_fc = Dropout (0.7 )(loss1_fc )
loss1_classifier = Dense (1000 ,name = 'loss1/classifier' ,W_regularizer = l2 (0.0002 ))(loss1_drop_fc )
loss1_classifier_act = Activation ('softmax' )(loss1_classifier )
inception_4b_1x1 = Convolution2D (160 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4b/1x1' ,W_regularizer = l2 (0.0002 ))(inception_4a_output )
inception_4b_3x3_reduce = Convolution2D (112 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4b/3x3_reduce' ,W_regularizer = l2 (0.0002 ))(inception_4a_output )
inception_4b_3x3 = Convolution2D (224 ,3 ,3 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4b/3x3' ,W_regularizer = l2 (0.0002 ))(inception_4b_3x3_reduce )
inception_4b_5x5_reduce = Convolution2D (24 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4b/5x5_reduce' ,W_regularizer = l2 (0.0002 ))(inception_4a_output )
inception_4b_5x5 = Convolution2D (64 ,5 ,5 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4b/5x5' ,W_regularizer = l2 (0.0002 ))(inception_4b_5x5_reduce )
inception_4b_pool = MaxPooling2D (pool_size = (3 ,3 ),strides = (1 ,1 ),border_mode = 'same' ,name = 'inception_4b/pool' )(inception_4a_output )
inception_4b_pool_proj = Convolution2D (64 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4b/pool_proj' ,W_regularizer = l2 (0.0002 ))(inception_4b_pool )
inception_4b_output = merge ([inception_4b_1x1 ,inception_4b_3x3 ,inception_4b_5x5 ,inception_4b_pool_proj ],mode = 'concat' ,concat_axis = 1 ,name = 'inception_4b_output' )
inception_4c_1x1 = Convolution2D (128 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4c/1x1' ,W_regularizer = l2 (0.0002 ))(inception_4b_output )
inception_4c_3x3_reduce = Convolution2D (128 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4c/3x3_reduce' ,W_regularizer = l2 (0.0002 ))(inception_4b_output )
inception_4c_3x3 = Convolution2D (256 ,3 ,3 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4c/3x3' ,W_regularizer = l2 (0.0002 ))(inception_4c_3x3_reduce )
inception_4c_5x5_reduce = Convolution2D (24 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4c/5x5_reduce' ,W_regularizer = l2 (0.0002 ))(inception_4b_output )
inception_4c_5x5 = Convolution2D (64 ,5 ,5 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4c/5x5' ,W_regularizer = l2 (0.0002 ))(inception_4c_5x5_reduce )
inception_4c_pool = MaxPooling2D (pool_size = (3 ,3 ),strides = (1 ,1 ),border_mode = 'same' ,name = 'inception_4c/pool' )(inception_4b_output )
inception_4c_pool_proj = Convolution2D (64 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4c/pool_proj' ,W_regularizer = l2 (0.0002 ))(inception_4c_pool )
inception_4c_output = merge ([inception_4c_1x1 ,inception_4c_3x3 ,inception_4c_5x5 ,inception_4c_pool_proj ],mode = 'concat' ,concat_axis = 1 ,name = 'inception_4c/output' )
inception_4d_1x1 = Convolution2D (112 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4d/1x1' ,W_regularizer = l2 (0.0002 ))(inception_4c_output )
inception_4d_3x3_reduce = Convolution2D (144 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4d/3x3_reduce' ,W_regularizer = l2 (0.0002 ))(inception_4c_output )
inception_4d_3x3 = Convolution2D (288 ,3 ,3 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4d/3x3' ,W_regularizer = l2 (0.0002 ))(inception_4d_3x3_reduce )
inception_4d_5x5_reduce = Convolution2D (32 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4d/5x5_reduce' ,W_regularizer = l2 (0.0002 ))(inception_4c_output )
inception_4d_5x5 = Convolution2D (64 ,5 ,5 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4d/5x5' ,W_regularizer = l2 (0.0002 ))(inception_4d_5x5_reduce )
inception_4d_pool = MaxPooling2D (pool_size = (3 ,3 ),strides = (1 ,1 ),border_mode = 'same' ,name = 'inception_4d/pool' )(inception_4c_output )
inception_4d_pool_proj = Convolution2D (64 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4d/pool_proj' ,W_regularizer = l2 (0.0002 ))(inception_4d_pool )
inception_4d_output = merge ([inception_4d_1x1 ,inception_4d_3x3 ,inception_4d_5x5 ,inception_4d_pool_proj ],mode = 'concat' ,concat_axis = 1 ,name = 'inception_4d/output' )
loss2_ave_pool = AveragePooling2D (pool_size = (5 ,5 ),strides = (3 ,3 ),name = 'loss2/ave_pool' )(inception_4d_output )
loss2_conv = Convolution2D (128 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'loss2/conv' ,W_regularizer = l2 (0.0002 ))(loss2_ave_pool )
loss2_flat = Flatten ()(loss2_conv )
loss2_fc = Dense (1024 ,activation = 'relu' ,name = 'loss2/fc' ,W_regularizer = l2 (0.0002 ))(loss2_flat )
loss2_drop_fc = Dropout (0.7 )(loss2_fc )
loss2_classifier = Dense (1000 ,name = 'loss2/classifier' ,W_regularizer = l2 (0.0002 ))(loss2_drop_fc )
loss2_classifier_act = Activation ('softmax' )(loss2_classifier )
inception_4e_1x1 = Convolution2D (256 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4e/1x1' ,W_regularizer = l2 (0.0002 ))(inception_4d_output )
inception_4e_3x3_reduce = Convolution2D (160 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4e/3x3_reduce' ,W_regularizer = l2 (0.0002 ))(inception_4d_output )
inception_4e_3x3 = Convolution2D (320 ,3 ,3 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4e/3x3' ,W_regularizer = l2 (0.0002 ))(inception_4e_3x3_reduce )
inception_4e_5x5_reduce = Convolution2D (32 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4e/5x5_reduce' ,W_regularizer = l2 (0.0002 ))(inception_4d_output )
inception_4e_5x5 = Convolution2D (128 ,5 ,5 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4e/5x5' ,W_regularizer = l2 (0.0002 ))(inception_4e_5x5_reduce )
inception_4e_pool = MaxPooling2D (pool_size = (3 ,3 ),strides = (1 ,1 ),border_mode = 'same' ,name = 'inception_4e/pool' )(inception_4d_output )
inception_4e_pool_proj = Convolution2D (128 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_4e/pool_proj' ,W_regularizer = l2 (0.0002 ))(inception_4e_pool )
inception_4e_output = merge ([inception_4e_1x1 ,inception_4e_3x3 ,inception_4e_5x5 ,inception_4e_pool_proj ],mode = 'concat' ,concat_axis = 1 ,name = 'inception_4e/output' )
inception_4e_output_zero_pad = ZeroPadding2D (padding = (1 , 1 ))(inception_4e_output )
pool4_helper = PoolHelper ()(inception_4e_output_zero_pad )
pool4_3x3_s2 = MaxPooling2D (pool_size = (3 ,3 ),strides = (2 ,2 ),border_mode = 'valid' ,name = 'pool4/3x3_s2' )(pool4_helper )
inception_5a_1x1 = Convolution2D (256 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5a/1x1' ,W_regularizer = l2 (0.0002 ))(pool4_3x3_s2 )
inception_5a_3x3_reduce = Convolution2D (160 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5a/3x3_reduce' ,W_regularizer = l2 (0.0002 ))(pool4_3x3_s2 )
inception_5a_3x3 = Convolution2D (320 ,3 ,3 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5a/3x3' ,W_regularizer = l2 (0.0002 ))(inception_5a_3x3_reduce )
inception_5a_5x5_reduce = Convolution2D (32 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5a/5x5_reduce' ,W_regularizer = l2 (0.0002 ))(pool4_3x3_s2 )
inception_5a_5x5 = Convolution2D (128 ,5 ,5 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5a/5x5' ,W_regularizer = l2 (0.0002 ))(inception_5a_5x5_reduce )
inception_5a_pool = MaxPooling2D (pool_size = (3 ,3 ),strides = (1 ,1 ),border_mode = 'same' ,name = 'inception_5a/pool' )(pool4_3x3_s2 )
inception_5a_pool_proj = Convolution2D (128 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5a/pool_proj' ,W_regularizer = l2 (0.0002 ))(inception_5a_pool )
inception_5a_output = merge ([inception_5a_1x1 ,inception_5a_3x3 ,inception_5a_5x5 ,inception_5a_pool_proj ],mode = 'concat' ,concat_axis = 1 ,name = 'inception_5a/output' )
inception_5b_1x1 = Convolution2D (384 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5b/1x1' ,W_regularizer = l2 (0.0002 ))(inception_5a_output )
inception_5b_3x3_reduce = Convolution2D (192 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5b/3x3_reduce' ,W_regularizer = l2 (0.0002 ))(inception_5a_output )
inception_5b_3x3 = Convolution2D (384 ,3 ,3 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5b/3x3' ,W_regularizer = l2 (0.0002 ))(inception_5b_3x3_reduce )
inception_5b_5x5_reduce = Convolution2D (48 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5b/5x5_reduce' ,W_regularizer = l2 (0.0002 ))(inception_5a_output )
inception_5b_5x5 = Convolution2D (128 ,5 ,5 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5b/5x5' ,W_regularizer = l2 (0.0002 ))(inception_5b_5x5_reduce )
inception_5b_pool = MaxPooling2D (pool_size = (3 ,3 ),strides = (1 ,1 ),border_mode = 'same' ,name = 'inception_5b/pool' )(inception_5a_output )
inception_5b_pool_proj = Convolution2D (128 ,1 ,1 ,border_mode = 'same' ,activation = 'relu' ,name = 'inception_5b/pool_proj' ,W_regularizer = l2 (0.0002 ))(inception_5b_pool )
inception_5b_output = merge ([inception_5b_1x1 ,inception_5b_3x3 ,inception_5b_5x5 ,inception_5b_pool_proj ],mode = 'concat' ,concat_axis = 1 ,name = 'inception_5b/output' )
pool5_7x7_s1 = AveragePooling2D (pool_size = (7 ,7 ),strides = (1 ,1 ),name = 'pool5/7x7_s2' )(inception_5b_output )
loss3_flat = Flatten ()(pool5_7x7_s1 )
pool5_drop_7x7_s1 = Dropout (0.4 )(loss3_flat )
loss3_classifier = Dense (1000 ,name = 'loss3/classifier' ,W_regularizer = l2 (0.0002 ))(pool5_drop_7x7_s1 )
loss3_classifier_act = Activation ('softmax' ,name = 'prob' )(loss3_classifier )
googlenet = Model (input = input , output = [loss1_classifier_act ,loss2_classifier_act ,loss3_classifier_act ])
if weights_path :
googlenet .load_weights (weights_path )
return googlenet
if __name__ == "__main__" :
img = imresize (imread ('cat.jpg' , mode = 'RGB' ), (224 , 224 )).astype (np .float32 )
img [:, :, 0 ] -= 123.68
img [:, :, 1 ] -= 116.779
img [:, :, 2 ] -= 103.939
img [:,:,[0 ,1 ,2 ]] = img [:,:,[2 ,1 ,0 ]]
img = img .transpose ((2 , 0 , 1 ))
img = np .expand_dims (img , axis = 0 )
# Test pretrained model
model = create_googlenet ('googlenet_weights.h5' )
sgd = SGD (lr = 0.1 , decay = 1e-6 , momentum = 0.9 , nesterov = True )
model .compile (optimizer = sgd , loss = 'categorical_crossentropy' )
out = model .predict (img ) # note: the model has three outputs
print np .argmax (out [2 ])