├── README.md ├── googLeNet.py ├── inceptionModel.py └── structure.png /README.md: -------------------------------------------------------------------------------- 1 | # googLeNet 2 | here is my implementation of the basic googLeNet described in the paper [Going Deeper with Convolutions](http://www.cv-foundation.org/openaccess/content_cvpr_2015/html/Szegedy_Going_Deeper_With_2015_CVPR_paper.html) in keras 3 | 4 | I wrapped the inception module described in the paper and put it in the file "inceptionModel.py" 5 | 6 | the structure of the net is described as following: 7 | 8 | ![pic](structure.png) 9 | -------------------------------------------------------------------------------- /googLeNet.py: -------------------------------------------------------------------------------- 1 | from scipy.misc import imread, imresize 2 | from keras.layers import Input, Dense, Conv2D, MaxPooling2D, AveragePooling2D, Dropout 3 | from keras.models import Model 4 | from keras.regularizers import l2 5 | from keras.optimizers import SGD 6 | import sys 7 | from inceptionModel import inception_model 8 | 9 | def define_model(weight_path = None): 10 | input = Input(shape=(224, 224, 3)) 11 | 12 | conv1_7x7_s2 = Conv2D(filters=64, kernel_size=(7, 7), strides=(2, 2), padding='same', activation='relu', kernel_regularizer=l2(0.01))(input) 13 | 14 | maxpool1_3x3_s2 = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(conv1_7x7_s2) 15 | 16 | conv2_3x3_reduce = Conv2D(filters=64, kernel_size=(1, 1), padding='same', activation='relu', kernel_regularizer=l2(0.01))(maxpool1_3x3_s2) 17 | 18 | conv2_3x3 = Conv2D(filters=192, kernel_size=(3, 3), padding='same', activation='relu', kernel_regularizer=l2(0.01))(conv2_3x3_reduce) 19 | 20 | maxpool2_3x3_s2 = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(conv2_3x3) 21 | 22 | inception_3a = inception_model(input=maxpool2_3x3_s2, filters_1x1=64, filters_3x3_reduce=96, filters_3x3=128, filters_5x5_reduce=16, filters_5x5=32, filters_pool_proj=32) 23 | 24 | inception_3b = inception_model(input=inception_3a, filters_1x1=128, filters_3x3_reduce=128, filters_3x3=192, filters_5x5_reduce=32, filters_5x5=96, filters_pool_proj=64) 25 | 26 | maxpool3_3x3_s2 = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(inception_3b) 27 | 28 | inception_4a = inception_model(input=maxpool3_3x3_s2, filters_1x1=192, filters_3x3_reduce=96, filters_3x3=208, filters_5x5_reduce=16, filters_5x5=48, filters_pool_proj=64) 29 | 30 | inception_4b = inception_model(input=inception_4a, filters_1x1=160, filters_3x3_reduce=112, filters_3x3=224, filters_5x5_reduce=24, filters_5x5=64, filters_pool_proj=64) 31 | 32 | inception_4c = inception_model(input=inception_4b, filters_1x1=128, filters_3x3_reduce=128, filters_3x3=256, filters_5x5_reduce=24, filters_5x5=64, filters_pool_proj=64) 33 | 34 | inception_4d = inception_model(input=inception_4c, filters_1x1=112, filters_3x3_reduce=144, filters_3x3=288, filters_5x5_reduce=32, filters_5x5=64, filters_pool_proj=64) 35 | 36 | inception_4e = inception_model(input=inception_4d, filters_1x1=256, filters_3x3_reduce=160, filters_3x3=320, filters_5x5_reduce=32, filters_5x5=128, filters_pool_proj=128) 37 | 38 | maxpool4_3x3_s2 = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(inception_4e) 39 | 40 | inception_5a = inception_model(input=maxpool4_3x3_s2, filters_1x1=256, filters_3x3_reduce=160, filters_3x3=320, filters_5x5_reduce=32, filters_5x5=128, filters_pool_proj=128) 41 | 42 | inception_5b = inception_model(input=inception_5a, filters_1x1=384, filters_3x3_reduce=192, filters_3x3=384, filters_5x5_reduce=48, filters_5x5=128, filters_pool_proj=128) 43 | 44 | averagepool1_7x7_s1 = AveragePooling2D(pool_size=(7, 7), strides=(7, 7), padding='same')(inception_5b) 45 | 46 | drop1 = Dropout(rate=0.4)(averagepool1_7x7_s1) 47 | 48 | linear = Dense(units=1000, activation='softmax', kernel_regularizer=l2(0.01))(keras.layers.core.Flatten(drop1)) 49 | last = linear 50 | 51 | 52 | model = Model(inputs=input, outputs=last) 53 | model.summary() 54 | 55 | 56 | if __name__ == '__main__': 57 | model = define_model() 58 | -------------------------------------------------------------------------------- /inceptionModel.py: -------------------------------------------------------------------------------- 1 | from keras.layers import Input, Dense, Conv2D, MaxPooling2D 2 | from keras.models import Model 3 | from keras.layers.merge import concatenate 4 | from keras.regularizers import l2 5 | 6 | def inception_model(input, filters_1x1, filters_3x3_reduce, filters_3x3, filters_5x5_reduce, filters_5x5, filters_pool_proj): 7 | conv_1x1 = Conv2D(filters=filters_1x1, kernel_size=(1, 1), padding='same', activation='relu', kernel_regularizer=l2(0.01))(input) 8 | 9 | conv_3x3_reduce = Conv2D(filters=filters_3x3_reduce, kernel_size=(1, 1), padding='same', activation='relu', kernel_regularizer=l2(0.01))(input) 10 | 11 | conv_3x3 = Conv2D(filters=filters_3x3, kernel_size=(3, 3), padding='same', activation='relu', kernel_regularizer=l2(0.01))(conv_3x3_reduce) 12 | 13 | conv_5x5_reduce = Conv2D(filters=filters_5x5_reduce, kernel_size=(1, 1), padding='same', activation='relu', kernel_regularizer=l2(0.01))(input) 14 | 15 | conv_5x5 = Conv2D(filters=filters_5x5, kernel_size=(5, 5), padding='same', activation='relu', kernel_regularizer=l2(0.01))(conv_5x5_reduce) 16 | 17 | maxpool = MaxPooling2D(pool_size=(3, 3), strides=(1, 1), padding='same')(input) 18 | 19 | maxpool_proj = Conv2D(filters=filters_pool_proj, kernel_size=(1, 1), strides=(1, 1), padding='same', activation='relu', kernel_regularizer=l2(0.01))(maxpool) 20 | 21 | inception_output = concatenate([conv_1x1, conv_3x3, conv_5x5, maxpool_proj], axis=3) # use tf as backend 22 | 23 | return inception_output -------------------------------------------------------------------------------- /structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dingchenwei/googLeNet/eebb4aac2c3c862f24fdf3e81bd90a80de9053c5/structure.png --------------------------------------------------------------------------------