def build_cnn(l1,l2): model = Sequential() # logpolar layer if l1 == 'LPC': model.add(LogPolar(input_shape=(h, w, dp))) # 200x150x3 => 200x150x3 model.add(Conv2D(32, (3, 3), activation='relu')) model.add(Conv2D(32, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 200x150x3 => 100x75 model.add(Dropout(0.25)) if l1 == 'LP': model.add(LogPolar(input_shape=(h, w, dp))) # 200x150x3 => 200x150x3 model.add(Conv2D(32, (3, 3), activation='relu')) model.add(Conv2D(32, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 200x150x3 => 100x75 model.add(Dropout(0.25)) if l1 == 'C': model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(h, w, dp))) # 200x150x3 => 198x148x32 model.add(Conv2D(32, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 198x148x32 => 99x74x32 model.add(Dropout(0.25)) if l2 == 'LPC': model.add(LogPolar()) # 200x150x3 => 200x150x3 model.add(Conv2D(64, (3, 3), activation='relu')) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 200x150x3 => 100x75 model.add(Dropout(0.25)) if l2 == 'LP': model.add(LogPolar()) # 99x74x32 => 99x74x32 model.add(Conv2D(64, (3, 3), activation='relu')) #model.add(Lambda(LogPolarLambda, output_shape=LogPolarLambda_output_shape)) # 99x74x32 => 99x74x32 model.add(MaxPooling2D(pool_size=(2, 3))) # 99x74x32 => 33x37x32 model.add(Dropout(0.25)) if l2 == 'C': model.add(Conv2D(64, (3, 3), activation='relu')) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 200x150 => 100x75 model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(1024, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(n_classes, activation='softmax')) # Compile model model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model
def build_cnn_alex(l1, l2): """" The first convolutional layer filters the 224×224×3 input image with 96 kernels of size 11×11×3 with a stride of 4 pixels (this is the distance between the receptive field centers of neighboring neurons in a kernel map). The second convolutional layer takes as input the (response-normalized and pooled) output of the first convolutional layer and filters it with 256 kernels of size 5 × 5 × 48. The third, fourth, and fifth convolutional layers are connected to one another without any intervening pooling or normalization layers. The third convolutional layer has 384 kernels of size 3 × 3 × 256 connected to the (normalized, pooled) outputs of the second convolutional layer. The fourth convolutional layer has 384 kernels of size 3 × 3 × 192 , and the fifth convolutional layer has 256 kernels of size 3 × 3 × 192. The fully-connected layers have 4096 neurons each. https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf """ # Define model architecture model = Sequential() #AlexNet with batch normalization in Keras #input image is 224x224 if l1 == 'LPC': model.add(LogPolar(input_shape=(h, w, dp))) # 200x150x3 => 200x150x3 model.add(Conv2D(64, (11, 11))) if l1 == 'LP': model.add(LogPolar(input_shape=(h, w, dp))) # 200x150x3 => 200x150x3 if l1 == 'C': model.add(Conv2D(64, (11, 11), input_shape=(h, w, dp))) model.add(BatchNormalization()) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(3, 3))) if l2 == 'LPC': model.add(LogPolar()) # 200x150x3 => 200x150x3 model.add(Conv2D(128, (7, 7))) if l2 == 'LP': model.add(LogPolar()) # 200x150x3 => 200x150x3 if l2 == 'C': model.add(Conv2D(128, (7, 7))) model.add(BatchNormalization()) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(3, 3))) model.add(Conv2D(192, (3, 3))) model.add(BatchNormalization()) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(3, 3))) model.add(Conv2D(256, (3, 3))) model.add(BatchNormalization()) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(3, 3))) model.add(Flatten()) model.add(Dense(4096, kernel_initializer='normal')) model.add(BatchNormalization()) model.add(Activation('relu')) model.add(Dense(4096, kernel_initializer='normal')) model.add(BatchNormalization()) model.add(Activation('relu')) model.add(Dense(n_classes, kernel_initializer='normal')) model.add(BatchNormalization()) model.add(Activation('softmax')) # Compile model sgd = optimizers.SGD(lr=0.01, momentum=0.9, decay=0.0005) model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) return model