GTSRB Model-2

            # vgg16
            model = Sequential()

            # Block 1 Convolution layer 1,2
            model.add(Conv2D(64, (3, 3), padding='same', input_shape=input_shape, activation='relu',
                      data_format='channels_last'))
            model.add(Conv2D(64, (3, 3), activation='relu'))
            model.add(MaxPooling2D((2, 2), strides=(2, 2)))

            # Block 2 Convolution layer 3,4
            model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))
            model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))
            model.add(MaxPooling2D((2, 2), strides=(2, 2)))

            # Block 3 Convolution layer 5,6,7
            model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))
            model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))
            model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))
            model.add(MaxPooling2D((2, 2), strides=(2, 2)))

            # Block 4 Convolution layer 8,9,10
            model.add(Conv2D(512, (3, 3), padding='same', activation='relu'))
            model.add(Conv2D(512, (3, 3), padding='same', activation='relu'))
            model.add(Conv2D(512, (3, 3), padding='same', activation='relu'))
            model.add(MaxPooling2D((2, 2), strides=(2, 2)))

            # Block 5 Convolution layer 11,12,13
            model.add(Conv2D(512, (3, 3), padding='same', activation='relu'))
            model.add(Conv2D(512, (3, 3), padding='same', activation='relu'))
            model.add(Conv2D(512, (3, 3), padding='same', activation='relu'))
            model.add(MaxPooling2D((2, 2), strides=(2, 2), name='final_pool'))

            # Block 5 Fully-connected layer 14,15 , Output layer 16
            model.add(Flatten())
            model.add(Dense(4096, activation='relu'))
            model.add(Dropout(0.5))
            model.add(Dense(4096, activation='relu'))
            model.add(Dropout(0.5))
            model.add(Dense(self.num_classes, activation='softmax'))
            lr = 0.01
            decay = 1e-6
            sgd = keras.optimizers.SGD(lr=lr, decay=decay, momentum=0.9, nesterov=True)

            model.compile(loss='categorical_crossentropy',
                          optimizer=sgd,
                          metrics=['accuracy'])