def AlexNet():
    model = Sequential()
    input_shape = (INPUT_FRAME_SIZE, INPUT_FRAME_SIZE, 3)
    model.add(
        Conv2D(96,
               kernel_size=(11, 11),
               activation='relu',
               input_shape=input_shape,
               strides=(4, 4)))
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
    model.add(customlayers.crosschannelnormalization(name="convpool_1"))
    model.add(Conv2D(256, (5, 5), activation='relu'))
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
    model.add(customlayers.crosschannelnormalization(name="convpool_2"))
    model.add(Conv2D(384, (3, 3), activation='relu'))
    model.add(Conv2D(384, (3, 3), activation='relu'))
    model.add(Conv2D(256, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
    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(NUMBER_OF_CLASSES, activation='softmax'))
    return model
def AlexNet(weights_path=None, heatmap=False):
    if heatmap:
        inputs = Input(shape=(3,None,None))
    else:
        inputs = Input(shape=(3,227,227))
    
    conv_1 = Convolution2D(96, 11, 11,subsample=(4,4),activation='relu',
                           name='conv_1')(inputs)
    
    conv_2 = MaxPooling2D((3, 3), strides=(2,2))(conv_1)
    conv_2 = crosschannelnormalization(name="convpool_1")(conv_2)
    conv_2 = ZeroPadding2D((2,2))(conv_2)
    conv_2 = merge([
        Convolution2D(128,5,5,activation="relu",name='conv_2_'+str(i+1))(
            splittensor(ratio_split=2,id_split=i)(conv_2)
        ) for i in range(2)], mode='concat',concat_axis=1,name="conv_2")

    conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
    conv_3 = crosschannelnormalization()(conv_3)
    conv_3 = ZeroPadding2D((1,1))(conv_3)
    conv_3 = Convolution2D(384,3,3,activation='relu',name='conv_3')(conv_3)

    conv_4 = ZeroPadding2D((1,1))(conv_3)
    conv_4 = merge([
        Convolution2D(192,3,3,activation="relu",name='conv_4_'+str(i+1))(
            splittensor(ratio_split=2,id_split=i)(conv_4)
        ) for i in range(2)], mode='concat',concat_axis=1,name="conv_4")

    conv_5 = ZeroPadding2D((1,1))(conv_4)
    conv_5 = merge([
        Convolution2D(128,3,3,activation="relu",name='conv_5_'+str(i+1))(
            splittensor(ratio_split=2,id_split=i)(conv_5)
        ) for i in range(2)], mode='concat',concat_axis=1,name="conv_5")
    
    dense_1 = MaxPooling2D((3, 3), strides=(2,2),name="convpool_5")(conv_5)

    if heatmap:
        dense_1 = Convolution2D(4096,6,6,activation="relu",name="dense_1")(dense_1)
        dense_2 = Convolution2D(4096,1,1,activation="relu",name="dense_2")(dense_1)
        dense_3 = Convolution2D(1000, 1,1,name="dense_3")(dense_2)
        prediction = Softmax4D(axis=1,name="softmax")(dense_3)
    else:
        dense_1 = Flatten(name="flatten")(dense_1)
        dense_1 = Dense(4096, activation='relu',name='dense_1')(dense_1)
        dense_2 = Dropout(0.5)(dense_1)
        dense_2 = Dense(4096, activation='relu',name='dense_2')(dense_2)
        dense_3 = Dropout(0.5)(dense_2)  
        dense_3 = Dense(1000,name='dense_3')(dense_3)
        prediction = Activation("softmax",name="softmax")(dense_3)

    
    model = Model(input=inputs, output=prediction)

    if weights_path:
        model.load_weights(weights_path)

    return model
def AlexNet(weights_path=None, heatmap=False, classes = 1000):
    if heatmap:
        inputs = Input(shape=(3,None,None))
    else:
        inputs = Input(shape=(3,227,227))

    conv_1 = Convolution2D(96, (11, 11),strides=(4,4),activation='relu',
                           name='conv_1')(inputs)

    conv_2 = MaxPooling2D((3, 3), strides=(2,2))(conv_1)
    conv_2 = crosschannelnormalization(name="convpool_1")(conv_2)
    conv_2 = ZeroPadding2D((2,2))(conv_2)
    conv_2 = merge([
        Convolution2D(128,(5,5),activation="relu",name='conv_2_'+str(i+1))(
            splittensor(ratio_split=2,id_split=i)(conv_2)
        ) for i in range(2)], mode='concat',concat_axis=1,name="conv_2")

    conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
    conv_3 = crosschannelnormalization()(conv_3)
    conv_3 = ZeroPadding2D((1,1))(conv_3)
    conv_3 = Convolution2D(384,(3,3),activation='relu',name='conv_3')(conv_3)

    conv_4 = ZeroPadding2D((1,1))(conv_3)
    conv_4 = merge([
        Convolution2D(192,(3,3),activation="relu",name='conv_4_'+str(i+1))(
            splittensor(ratio_split=2,id_split=i)(conv_4)
        ) for i in range(2)], mode='concat',concat_axis=1,name="conv_4")

    conv_5 = ZeroPadding2D((1,1))(conv_4)
    conv_5 = merge([
        Convolution2D(128,(3,3),activation="relu",name='conv_5_'+str(i+1))(
            splittensor(ratio_split=2,id_split=i)(conv_5)
        ) for i in range(2)], mode='concat',concat_axis=1,name="conv_5")

    dense_1 = MaxPooling2D((3, 3), strides=(2,2),name="convpool_5")(conv_5)
    dense_1 = Flatten(name="flatten")(dense_1)
    dense_1 = Dense(4096, activation='relu',name='dense_1')(dense_1)
    dense_2 = Dropout(0.5)(dense_1)
    dense_2 = Dense(4096, activation='relu',name='dense_2')(dense_2)
    dense_3 = Dropout(0.5)(dense_2)   
    dense_3 = Dense(classes, name='dense_3a')(dense_3)
    prediction = Activation("softmax",name="softmaxa")(dense_3)


    model = Model(input=inputs, output=prediction, name='alexnet')

    if weights_path:
        model.load_weights(weights_path, by_name=True)

    # Learning rate is changed to 0.0001
    sgd = SGD(lr=1e-4, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])


    return model
Exemple #4
0
def AlexNet(weights_path=None, heatmap=False):
    if heatmap:
        inputs = Input(shape=(3,None,None))
    else:
        inputs = Input(shape=(1,227,227))

    conv_1 = Convolution2D(96, 11, 11,subsample=(4,4),activation='relu',
                           name='conv_1')(inputs)

    conv_2 = MaxPooling2D((3, 3), strides=(2,2))(conv_1)
    conv_2 = crosschannelnormalization(name="convpool_1")(conv_2)
    conv_2 = ZeroPadding2D((2,2))(conv_2)
    conv_2 = merge([
        Convolution2D(128,5,5,activation="relu",name='conv_2_'+str(i+1))(
            splittensor(ratio_split=2,id_split=i)(conv_2)
        ) for i in range(2)], mode='concat',concat_axis=1,name="conv_2")

    conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
    conv_3 = crosschannelnormalization()(conv_3)
    conv_3 = ZeroPadding2D((1,1))(conv_3)
    conv_3 = Convolution2D(384,3,3,activation='relu',name='conv_3')(conv_3)

    conv_4 = ZeroPadding2D((1,1))(conv_3)
    conv_4 = merge([
        Convolution2D(192,3,3,activation="relu",name='conv_4_'+str(i+1))(
            splittensor(ratio_split=2,id_split=i)(conv_4)
        ) for i in range(2)], mode='concat',concat_axis=1,name="conv_4")

    conv_5 = ZeroPadding2D((1,1))(conv_4)
    conv_5 = merge([
        Convolution2D(128,3,3,activation="relu",name='conv_5_'+str(i+1))(
            splittensor(ratio_split=2,id_split=i)(conv_5)
        ) for i in range(2)], mode='concat',concat_axis=1,name="conv_5")

    dense_1 = MaxPooling2D((3, 3), strides=(2,2),name="convpool_5")(conv_5)

    if heatmap:
        dense_1 = Convolution2D(4096,6,6,activation="relu",name="dense_1")(dense_1)
        dense_2 = Convolution2D(4096,1,1,activation="relu",name="dense_2")(dense_1)
        dense_3 = Convolution2D(1000, 1,1,name="dense_3")(dense_2)
        prediction = Softmax4D(axis=1,name="softmax")(dense_3)
    else:
        dense_1 = Flatten(name="flatten")(dense_1)
        dense_1 = Dense(4096, activation='relu',name='dense_1')(dense_1)
        dense_2 = Dropout(0.5)(dense_1)
        dense_2 = Dense(4096, activation='relu',name='dense_2')(dense_2)
        dense_3 = Dropout(0.5)(dense_2)
        dense_3 = Dense(2,name='dense_3')(dense_3)
        prediction = Activation("softmax",name="softmax")(dense_3)


    model = Model(input=inputs, output=prediction)
Exemple #5
0
def AlexNet(weights_path=None,
            inputs1=None,
            inputs2=None,
            id='',
            trainable=True):

    conv_1_op = Convolution2D(96,
                              11,
                              11,
                              subsample=(4, 4),
                              activation='relu',
                              name=id + 'conv_1',
                              trainable=trainable)

    conv_1 = conv_1_op(inputs1)

    conv_2 = MaxPooling2D((3, 3), strides=(2, 2))(conv_1)
    conv_2 = crosschannelnormalization(name=id + "convpool_1")(conv_2)
    conv_2 = ZeroPadding2D((2, 2))(conv_2)

    conv_2_op_a = Convolution2D(128,
                                5,
                                5,
                                activation="relu",
                                name=id + 'conv_2_1',
                                trainable=trainable)
    conv_2_op_b = Convolution2D(128,
                                5,
                                5,
                                activation="relu",
                                name=id + 'conv_2_2',
                                trainable=trainable)
    conv_2 = merge([
        conv_2_op_a(splittensor(ratio_split=2, id_split=0)(conv_2)),
        conv_2_op_b(splittensor(ratio_split=2, id_split=1)(conv_2))
    ],
                   mode='concat',
                   concat_axis=1,
                   name=id + "conv_2")

    conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
    conv_3 = crosschannelnormalization()(conv_3)
    conv_3 = ZeroPadding2D((1, 1))(conv_3)

    conv_3_op = Convolution2D(384,
                              3,
                              3,
                              activation='relu',
                              name=id + 'conv_3',
                              trainable=trainable)
    conv_3 = conv_3_op(conv_3)

    conv_4 = ZeroPadding2D((1, 1))(conv_3)

    conv_4_op_a = Convolution2D(192,
                                3,
                                3,
                                activation="relu",
                                name=id + 'conv_4_1',
                                trainable=trainable)
    conv_4_op_b = Convolution2D(192,
                                3,
                                3,
                                activation="relu",
                                name=id + 'conv_4_2',
                                trainable=trainable)

    conv_4 = merge([
        conv_4_op_a(splittensor(ratio_split=2, id_split=0)(conv_4)),
        conv_4_op_b(splittensor(ratio_split=2, id_split=1)(conv_4))
    ],
                   mode='concat',
                   concat_axis=1,
                   name=id + "conv_4")

    conv_5 = ZeroPadding2D((1, 1))(conv_4)

    conv_5_op_a = Convolution2D(128,
                                3,
                                3,
                                activation="relu",
                                name=id + 'conv_5_1',
                                trainable=trainable)
    conv_5_op_b = Convolution2D(128,
                                3,
                                3,
                                activation="relu",
                                name=id + 'conv_5_2',
                                trainable=trainable)
    conv_5 = merge([
        conv_5_op_a(splittensor(ratio_split=2, id_split=0)(conv_5)),
        conv_5_op_b(splittensor(ratio_split=2, id_split=1)(conv_5))
    ],
                   mode='concat',
                   concat_axis=1,
                   name=id + "conv_5")

    dense_1 = MaxPooling2D((3, 3),
                           strides=(2, 2),
                           name=id + "convpool_5",
                           trainable=trainable)(conv_5)
    dense_1 = Flatten(name=id + "flatten")(dense_1)

    dense_1_op = Dense(4096,
                       activation='relu',
                       name=id + 'dense_1',
                       trainable=trainable)
    dense_1_a = dense_1_op(dense_1)

    dense_2_op = Dense(4096,
                       activation='relu',
                       name=id + 'dense_2_gel',
                       trainable=True)
    dense_2 = dense_2_op(dense_1_a)

    dense_3_op = Dense(1000,
                       name=id + 'dense_3_100',
                       activation='sigmoid',
                       trainable=trainable)
    dense_3 = dense_3_op(dense_2)

    model = Model(input=inputs1, output=dense_3)

    if weights_path:
        model.load_weights(weights_path, by_name=True)
        print "model loaded"
        #model.save_weights('../../data/weights/alexnet_weights_finetune.h5')

    super_op = Dense(8, name=id + 'supervision', activation='softmax')
    dense_4_1 = dense_2
    supervision_1 = super_op(dense_4_1)

    # FOR INPUTS2
    id = '2'

    conv_1 = conv_1_op(inputs2)

    conv_2 = MaxPooling2D((3, 3), strides=(2, 2))(conv_1)
    conv_2 = crosschannelnormalization(name=id + "convpool_1")(conv_2)
    conv_2 = ZeroPadding2D((2, 2))(conv_2)

    conv_2 = merge([
        conv_2_op_a(splittensor(ratio_split=2, id_split=0)(conv_2)),
        conv_2_op_b(splittensor(ratio_split=2, id_split=1)(conv_2))
    ],
                   mode='concat',
                   concat_axis=1,
                   name=id + "conv_2")

    conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
    conv_3 = crosschannelnormalization()(conv_3)
    conv_3 = ZeroPadding2D((1, 1))(conv_3)

    conv_3 = conv_3_op(conv_3)
    conv_4 = ZeroPadding2D((1, 1))(conv_3)

    conv_4 = merge([
        conv_4_op_a(splittensor(ratio_split=2, id_split=0)(conv_4)),
        conv_4_op_b(splittensor(ratio_split=2, id_split=1)(conv_4))
    ],
                   mode='concat',
                   concat_axis=1,
                   name=id + "conv_4")

    conv_5 = ZeroPadding2D((1, 1))(conv_4)
    conv_5 = merge([
        conv_5_op_a(splittensor(ratio_split=2, id_split=0)(conv_5)),
        conv_5_op_b(splittensor(ratio_split=2, id_split=1)(conv_5))
    ],
                   mode='concat',
                   concat_axis=1,
                   name=id + "conv_5")

    dense_1 = MaxPooling2D((3, 3), strides=(2, 2),
                           name=id + "convpool_5")(conv_5)
    dense_1 = Flatten(name=id + "flatten")(dense_1)
    dense_1_1 = dense_1_op(dense_1)
    dense_2 = dense_2_op(dense_1_1)

    dense_4_2 = dense_2
    super_op = Dense(8, name=id + 'supervision', activation='softmax')
    supervision_2 = super_op(dense_4_2)

    single_model = Model(input=inputs1, output=dense_4_1)
    return dense_4_1, dense_4_2, supervision_1, supervision_2
Exemple #6
0
def get_alex(params, weights=None):

    #inputs = Input(shape=(params['nb_channels'], params['im_size'], params['im_size']))

    inputs = Input(shape=(3, params['im_size'], params['im_size']))

    #model.add(Convolution2D(96, (3, 3), activation='relu', padding='same', name='conv2', strides=(1, 1)))

    conv_1 = Convolution2D(96, (11, 11),
                           strides=(4, 4),
                           activation='relu',
                           name='conv_1')(inputs)

    conv_2 = MaxPooling2D(pool_size=(3, 3), strides=(2, 2))(conv_1)
    conv_2 = crosschannelnormalization(name='convpool_1')(conv_2)
    conv_2 = ZeroPadding2D((2, 2))(conv_2)
    conv_2 = merge([
        Convolution2D(
            128, 5, 5, activation='relu', name='conv_2_' + str(i + 1))(
                splittensor(ratio_split=2, id_split=i)(conv_2))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name='conv_2')

    conv_3 = MaxPooling2D(pool_size=(3, 3), strides=(2, 2))(conv_2)
    conv_3 = crosschannelnormalization()(conv_3)
    conv_3 = ZeroPadding2D((1, 1))(conv_3)
    conv_3 = Convolution2D(384, 3, 3, activation='relu', name='conv_3')(conv_3)

    conv_4 = ZeroPadding2D((1, 1))(conv_3)
    conv_4 = merge([
        Convolution2D(
            192, 3, 3, activation='relu', name='conv_4_' + str(i + 1))(
                splittensor(ratio_split=2, id_split=i)(conv_4))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name='conv_4')

    conv_5 = ZeroPadding2D((1, 1))(conv_4)
    conv_5 = merge([
        Convolution2D(
            128, 3, 3, activation='relu', name='conv_5_' + str(i + 1))(
                splittensor(ratio_split=2, id_split=i)(conv_5))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name='conv_5')

    dense_1 = MaxPooling2D(pool_size=(3, 3), strides=(2, 2),
                           name='convpool_5')(conv_5)

    dense_1 = Flatten(name='flatten')(dense_1)
    dense_1 = Dense(4096, activation='relu', name='dense_1')(dense_1)
    dense_2 = Dropout(0.5)(dense_1)
    dense_2 = Dense(4096, activation='relu', name='dense_2')(dense_2)
    dense_3 = Dropout(0.5)(dense_2)
    dense_3 = Dense(1000, name='dense_3')(dense_3)
    prediction = Activation('softmax', name='softmax')(dense_3)

    model = Model(input=inputs, output=prediction)

    if weights:
        model.load_weights(weights)

    return model
def get_alexnet(input_shape, nb_classes, mean_flag):
    # code adapted from https://github.com/heuritech/convnets-keras

    inputs = Input(shape=input_shape)

    if mean_flag:
        mean_subtraction = Lambda(mean_subtract,
                                  name='mean_subtraction')(inputs)
        conv_1 = Convolution2D(96,
                               11,
                               11,
                               subsample=(4, 4),
                               activation='relu',
                               name='conv_1',
                               init='he_normal')(mean_subtraction)
    else:
        conv_1 = Convolution2D(96,
                               11,
                               11,
                               subsample=(4, 4),
                               activation='relu',
                               name='conv_1',
                               init='he_normal')(inputs)

    conv_2 = crosschannelnormalization(name="convpool_1")(conv_1)
    conv_2 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
    conv_2 = ZeroPadding2D((2, 2))(conv_2)
    conv_2 = merge([
        Convolution2D(128,
                      5,
                      5,
                      activation="relu",
                      init='he_normal',
                      name='conv_2_' + str(i + 1))(splittensor(
                          ratio_split=2, id_split=i)(conv_2)) for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name="conv_2")

    conv_3 = crosschannelnormalization()(conv_2)
    conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_3)
    conv_3 = ZeroPadding2D((1, 1))(conv_3)
    conv_3 = Convolution2D(384,
                           3,
                           3,
                           activation='relu',
                           name='conv_3',
                           init='he_normal')(conv_3)

    conv_4 = ZeroPadding2D((1, 1))(conv_3)
    conv_4 = merge([
        Convolution2D(192,
                      3,
                      3,
                      activation="relu",
                      init='he_normal',
                      name='conv_4_' + str(i + 1))(splittensor(
                          ratio_split=2, id_split=i)(conv_4)) for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name="conv_4")

    conv_5 = ZeroPadding2D((1, 1))(conv_4)
    conv_5 = merge([
        Convolution2D(128,
                      3,
                      3,
                      activation="relu",
                      init='he_normal',
                      name='conv_5_' + str(i + 1))(splittensor(
                          ratio_split=2, id_split=i)(conv_5)) for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name="conv_5")

    dense_1 = MaxPooling2D((3, 3), strides=(2, 2), name="convpool_5")(conv_5)

    dense_1 = Flatten(name="flatten")(dense_1)
    dense_1 = Dense(4096, activation='relu', name='dense_1',
                    init='he_normal')(dense_1)
    dense_2 = Dropout(0.5)(dense_1)
    dense_2 = Dense(4096, activation='relu', name='dense_2',
                    init='he_normal')(dense_2)
    dense_3 = Dropout(0.5)(dense_2)
    dense_3 = Dense(nb_classes, name='dense_3_new', init='he_normal')(dense_3)

    prediction = Activation("softmax", name="softmax")(dense_3)

    alexnet = Model(input=inputs, output=prediction)

    return alexnet
def alexnet_model(img_rows, img_cols, channels=1, num_classes=None, use_pretraining=True,
                  pretrained_weights_path=None, fine_tuning_method=END_TO_END_FINE_TUNING, optimizer=None, loss=None,
                  weights_path=None):
    inputs = Input(shape=(channels, img_rows, img_cols))
    conv_1 = Convolution2D(96, 11, 11, subsample=(4, 4), activation='relu',
                           name='conv_1')(inputs)

    conv_2 = MaxPooling2D((3, 3), strides=(2, 2))(conv_1)
    conv_2 = crosschannelnormalization(name='convpool_1')(conv_2)
    conv_2 = ZeroPadding2D((2, 2))(conv_2)
    conv_2 = merge([
        Convolution2D(128, 5, 5, activation='relu', name='conv_2_' + str(i + 1))(
            splittensor(ratio_split=2, id_split=i)(conv_2)
        ) for i in range(2)], mode='concat', concat_axis=1, name='conv_2')

    conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
    conv_3 = crosschannelnormalization()(conv_3)
    conv_3 = ZeroPadding2D((1, 1))(conv_3)
    conv_3 = Convolution2D(384, 3, 3, activation='relu', name='conv_3')(conv_3)

    conv_4 = ZeroPadding2D((1, 1))(conv_3)
    conv_4 = merge([
        Convolution2D(192, 3, 3, activation='relu', name='conv_4_' + str(i + 1))(
            splittensor(ratio_split=2, id_split=i)(conv_4)
        ) for i in range(2)], mode='concat', concat_axis=1, name='conv_4')

    conv_5 = ZeroPadding2D((1, 1))(conv_4)
    conv_5 = merge([
        Convolution2D(128, 3, 3, activation='relu', name='conv_5_' + str(i + 1))(
            splittensor(ratio_split=2, id_split=i)(conv_5)
        ) for i in range(2)], mode='concat', concat_axis=1, name='conv_5')

    dense_1 = MaxPooling2D((3, 3), strides=(2, 2), name='convpool_5')(conv_5)
    dense_1 = Flatten(name='flatten')(dense_1)
    dense_1 = Dense(4096, activation='relu', name='dense_1')(dense_1)
    dense_2 = Dropout(0.5)(dense_1)
    dense_2 = Dense(4096, activation='relu', name='dense_2')(dense_2)
    dense_3 = Dropout(0.5)(dense_2)
    dense_3 = Dense(1000, name='dense_3')(dense_3)
    prediction = Activation('softmax', name='softmax')(dense_3)

    model = Model(input=inputs, output=prediction)

    # Load from ImageNet pretrained weights only if creating a new model
    if weights_path is None:
        if use_pretraining:
            if pretrained_weights_path:
                model.load_weights(pretrained_weights_path)
            else:
                raise Exception('use_pretraining is true but pretrained_weights_path is not specified!')

    # Removing the final dense_3 layer and adding the layers with correct classification size
    model.layers.pop()
    model.layers.pop()

    last = model.layers[-1].output
    last = Dense(num_classes, name='dense_3')(last)
    prediction = Activation('softmax', name='softmax')(last)

    model = Model(model.input, prediction)

    if fine_tuning_method == FREEZE_INITIAL_LAYERS:
        print(get_time_string() + 'Freezing initial 20 layers of the network..')
        for layer in model.layers[:20]:
            layer.trainable = False

    # Load from previously saved weights
    if weights_path is not None:
        model.load_weights(weights_path)

    if optimizer == 'sgd':
        optimizer = SGD(lr=1e-3, decay=1e-6, momentum=0.9, nesterov=True)
    if loss == 'l1':
        loss = get_l1_loss

    print(get_time_string() + 'Compiling the model..')
    model.compile(optimizer=optimizer, loss=loss)

    print('Number of layers: ' + str(len(model.layers)))
    print(model.summary())

    return model
Exemple #9
0
    def alexnet_branches(self, train=True):
        p = 0.6

        if not train:
            p = 0.0

        inputs = Input(shape=(3, 227, 227))
        self.inputs = inputs
        conv_1 = Convolution2D(96,
                               11,
                               11,
                               subsample=(4, 4),
                               activation='relu',
                               name='conv_1')(inputs)

        conv_2 = MaxPooling2D((3, 3), strides=(2, 2))(conv_1)
        conv_2 = crosschannelnormalization(name="convpool_1")(conv_2)
        conv_2 = ZeroPadding2D((2, 2))(conv_2)
        conv_2 = merge([
            Convolution2D(
                128, 5, 5, activation="relu", name='conv_2_' + str(i + 1))(
                    splittensor(ratio_split=2, id_split=i)(conv_2))
            for i in range(2)
        ],
                       mode='concat',
                       concat_axis=1,
                       name="conv_2")

        conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
        conv_3 = crosschannelnormalization()(conv_3)
        conv_3 = ZeroPadding2D((1, 1))(conv_3)
        conv_3 = Convolution2D(384, 3, 3, activation='relu',
                               name='conv_3')(conv_3)

        conv_4_0 = ZeroPadding2D((1, 1))(conv_3)
        conv_4 = merge([
            Convolution2D(
                192, 3, 3, activation="relu", name='conv_4_' + str(i + 1))(
                    splittensor(ratio_split=2, id_split=i)(conv_4_0))
            for i in range(2)
        ],
                       mode='concat',
                       concat_axis=1,
                       name="conv_4")

        conv_5_0 = ZeroPadding2D((1, 1))(conv_4)
        conv_5 = merge([
            Convolution2D(
                128, 3, 3, activation="relu", name='conv_5_' + str(i + 1))(
                    splittensor(ratio_split=2, id_split=i)(conv_5_0))
            for i in range(2)
        ],
                       mode='concat',
                       concat_axis=1,
                       name="conv_5")

        finalmax = MaxPooling2D((3, 3), strides=(2, 2),
                                name="convpool_5")(conv_5)

        dense_1_1 = Flatten(name="flatten")(finalmax)
        dense_1 = Dense(4096, activation='relu')(dense_1_1)
        dense_2 = Dropout(p)(dense_1)
        dense_2 = Dense(4096, activation='relu')(dense_2)
        dense_3 = Dropout(p)(dense_2)
        dense_4 = Dense(1000)(dense_3)
        prediction = Activation("softmax", name="softmax")(dense_4)

        model = Model(input=inputs, output=prediction)

        if train:
            model.load_weights('weights/alexnet_weights.h5')

        for i in range(9):
            model.layers.pop()

        #up1 = UpSampling2D((15,15),dim_ordering='th')(conv_5_0)
        branches = []
        for i in range(21):
            branches.append(self.branchout(conv_5_0, 'uniform'))

        prediction = merge(branches, mode='concat', concat_axis=1)
        #prediction = Activation('softmax')(prediction)
        prediction = Lambda(self.maxnorm,
                            output_shape=self.maxnormshape)(prediction)

        model = Model(input=inputs, output=prediction)

        if not train:
            model.load_weights('newweights/alexvoc_branchavg.h5')

        self.model = model

        print(model.summary())
        self.model.compile(loss='categorical_crossentropy',
                           optimizer=sgd,
                           metrics=['mse'])
        return self.model
Exemple #10
0
    def alexnetcam(self, train=True):
        p = 0.6

        if not train:
            p = 0.0

        inputs = Input(shape=(3, 227, 227))
        self.inputs = inputs
        conv_1 = Convolution2D(96,
                               11,
                               11,
                               subsample=(4, 4),
                               activation='relu',
                               name='conv_1')(inputs)

        conv_2 = MaxPooling2D((3, 3), strides=(2, 2))(conv_1)
        conv_2 = crosschannelnormalization(name="convpool_1")(conv_2)
        conv_2 = ZeroPadding2D((2, 2))(conv_2)
        conv_2 = merge([
            Convolution2D(
                128, 5, 5, activation="relu", name='conv_2_' + str(i + 1))(
                    splittensor(ratio_split=2, id_split=i)(conv_2))
            for i in range(2)
        ],
                       mode='concat',
                       concat_axis=1,
                       name="conv_2")

        conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
        conv_3 = crosschannelnormalization()(conv_3)
        conv_3 = ZeroPadding2D((1, 1))(conv_3)
        conv_3 = Convolution2D(384, 3, 3, activation='relu',
                               name='conv_3')(conv_3)

        conv_4_0 = ZeroPadding2D((1, 1))(conv_3)
        conv_4 = merge([
            Convolution2D(
                192, 3, 3, activation="relu", name='conv_4_' + str(i + 1))(
                    splittensor(ratio_split=2, id_split=i)(conv_4_0))
            for i in range(2)
        ],
                       mode='concat',
                       concat_axis=1,
                       name="conv_4")

        conv_5_0 = ZeroPadding2D((1, 1))(conv_4)
        conv_5 = merge([
            Convolution2D(
                128, 3, 3, activation="relu", name='conv_5_' + str(i + 1))(
                    splittensor(ratio_split=2, id_split=i)(conv_5_0))
            for i in range(2)
        ],
                       mode='concat',
                       concat_axis=1,
                       name="conv_5")

        finalmax = MaxPooling2D((3, 3), strides=(2, 2),
                                name="convpool_5")(conv_5)

        dense_1_1 = Flatten(name="flatten")(finalmax)
        dense_1 = Dense(4096, activation='relu')(dense_1_1)
        dense_2 = Dropout(p)(dense_1)
        dense_2 = Dense(4096, activation='relu')(dense_2)
        dense_3 = Dropout(p)(dense_2)
        dense_4 = Dense(1000)(dense_3)
        prediction = Activation("softmax", name="softmax")(dense_4)

        model = Model(input=inputs, output=prediction)

        if train:
            model.load_weights('weights/alexnet_weights.h5')

        for i in range(9):
            model.layers.pop()

        for layer in model.layers:
            layer.trainable = False

        conv_5 = Convolution2D(256,
                               3,
                               3,
                               activation="relu",
                               border_mode='same',
                               init='glorot_uniform')(conv_5_0)
        #conv_5 = Convolution2D(32,3,3,activation="relu",border_mode='same',init='glorot_uniform')(conv_5_0)
        finalmax = AveragePooling2D((15, 15))(conv_5)
        dense_3 = Flatten()(finalmax)
        dense_4 = Dense(20, init='glorot_uniform')(dense_3)

        prediction = Activation("sigmoid", name="softmax")(dense_4)

        model = Model(input=inputs, output=prediction)

        if not train:
            model.load_weights('newweights/alexvoc_cam.h5')

        self.model = model

        print(model.summary())
        self.model.compile(loss='categorical_crossentropy',
                           optimizer=sgd,
                           metrics=['mse'])
        return self.model
Exemple #11
0
def AlexNet_100(weights_path=None, heatmap=False):
    if heatmap:
        inputs = Input(shape=(None, None, 3))
    else:
        inputs = Input(shape=(100, 100, 3))

    conv_1 = Conv2D(96, (11, 11),
                    strides=(4, 4),
                    activation='relu',
                    name='conv_1')(inputs)

    conv_2 = MaxPooling2D((3, 3), strides=(2, 2))(conv_1)
    conv_2 = crosschannelnormalization(name='convpool_1')(conv_2)
    conv_2 = ZeroPadding2D((2, 2))(conv_2)
    conv_2 = merge([
        Conv2D(128, (5, 5), activation='relu', name='conv_2_' + str(i + 1))(
            splittensor(ratio_split=2, id_split=i)(conv_2)) for i in range(2)
    ],
                   mode='concat',
                   concat_axis=-1,
                   name='conv_2')

    conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
    conv_3 = crosschannelnormalization()(conv_3)
    conv_3 = ZeroPadding2D((1, 1))(conv_3)
    conv_3 = Conv2D(384, (3, 3), activation='relu', name='conv_3')(conv_3)

    conv_4 = ZeroPadding2D((1, 1))(conv_3)
    conv_4 = merge([
        Conv2D(192, (3, 3), activation='relu', name='conv_4_' + str(i + 1))(
            splittensor(ratio_split=2, id_split=i)(conv_4)) for i in range(2)
    ],
                   mode='concat',
                   concat_axis=-1,
                   name='conv_4')

    conv_5 = ZeroPadding2D((1, 1))(conv_4)
    conv_5 = merge([
        Conv2D(128, (3, 3), activation='relu', name='conv_5_' + str(i + 1))(
            splittensor(ratio_split=2, id_split=i)(conv_5)) for i in range(2)
    ],
                   mode='concat',
                   concat_axis=-1,
                   name='conv_5')

    dense_1 = MaxPooling2D((3, 3), strides=(2, 2), name='convpool_5')(conv_5)

    if heatmap:
        dense_1 = Conv2D(4096, (6, 6), activation='relu',
                         name='dense_1')(dense_1)
        dense_2 = Conv2D(4096, (1, 1), activation='relu',
                         name='dense_2')(dense_1)
        dense_3 = Conv2D(1000, (1, 1), name='dense_3')(dense_2)
        prediction = Softmax4D(axis=1, name='softmax')(dense_3)
    else:
        dense_1 = Flatten(name='flatten')(dense_1)
        dense_1 = Dense(4096, activation='relu', name='dense_1')(dense_1)
        dense_2 = Dropout(0.5)(dense_1)
        dense_2 = Dense(4096, activation='relu', name='dense_2')(dense_2)
        dense_3 = Dropout(0.5)(dense_2)
        dense_3 = Dense(1000, name='dense_3')(dense_3)
        prediction = Activation('softmax', name='softmax')(dense_3)

    model = Model(input=inputs, output=prediction)

    if weights_path:
        model.load_weights(weights_path)

    lastlayer = model.layers[-3].output
    if heatmap:
        dense_3 = Conv2D(1000, (1, 1), activation='relu',
                         name='dense_3')(lastlayer)
        dense_4 = Conv2D(2, (1, 1), name='dense_4')(dense_3)
        prediction = Softmax4D(axis=1, name='softmax')(dense_4)
    else:
        dense_3 = Dense(1000, activation='relu', name='dense_3')(lastlayer)
        dense_4 = Dropout(0.5)(dense_3)
        dense_4 = Dense(2, name='dense_4')(dense_4)
        prediction = Activation('softmax', name='softmax')(dense_4)

    model = Model(inputs=inputs, outputs=prediction)

    return model
Exemple #12
0
def AlexNet(weights_path=None,
            inputs=None,
            id='1',
            trainable=True,
            finetune=False,
            last_layer=None):
    if inputs == None:
        inputs = Input(shape=(3, 227, 227))

    conv_1 = Convolution2D(96,
                           11,
                           11,
                           subsample=(4, 4),
                           activation='relu',
                           name=id + 'conv_1',
                           trainable=trainable)(inputs)

    conv_2 = MaxPooling2D((3, 3), strides=(2, 2))(conv_1)
    conv_2 = crosschannelnormalization(name=id + "convpool_1")(conv_2)
    conv_2 = ZeroPadding2D((2, 2))(conv_2)
    conv_2 = merge([
        Convolution2D(128,
                      5,
                      5,
                      activation="relu",
                      name=id + 'conv_2_' + str(i + 1),
                      trainable=trainable)(splittensor(ratio_split=2,
                                                       id_split=i)(conv_2))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name=id + "conv_2")

    conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
    conv_3 = crosschannelnormalization()(conv_3)
    conv_3 = ZeroPadding2D((1, 1))(conv_3)
    conv_3 = Convolution2D(384,
                           3,
                           3,
                           activation='relu',
                           name=id + 'conv_3',
                           trainable=trainable)(conv_3)

    conv_4 = ZeroPadding2D((1, 1))(conv_3)
    conv_4 = merge([
        Convolution2D(192,
                      3,
                      3,
                      activation="relu",
                      name=id + 'conv_4_' + str(i + 1),
                      trainable=trainable)(splittensor(ratio_split=2,
                                                       id_split=i)(conv_4))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name=id + "conv_4")

    conv_5 = ZeroPadding2D((1, 1))(conv_4)
    conv_5 = merge([
        Convolution2D(128,
                      3,
                      3,
                      activation="relu",
                      name=id + 'conv_5_' + str(i + 1),
                      trainable=trainable)(splittensor(ratio_split=2,
                                                       id_split=i)(conv_5))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name=id + "conv_5")

    dense_1 = MaxPooling2D((3, 3),
                           strides=(2, 2),
                           name=id + "convpool_5",
                           trainable=trainable)(conv_5)

    dense_1 = Flatten(name=id + "flatten")(dense_1)
    dense_1 = Dense(4096,
                    activation='relu',
                    name=id + 'dense_1',
                    trainable=trainable)(dense_1)
    dense_2 = Dense(4096, name=id + 'dense_4', trainable=True)(dense_1)
    dense_2_act = Activation('relu')(dense_2)

    dense_2_alex = Dense(4096,
                         name=id + 'dense_4',
                         trainable=True,
                         W_regularizer=l2(0))(dense_1)
    dense_2_alex_act = Activation('relu',
                                  name=id + 'dense_4_embedding')(dense_2_alex)
    dense_3_alex = Dense(1000,
                         name=id + 'dense_3_100',
                         activation='sigmoid',
                         trainable=trainable)(dense_2_alex_act)

    if last_layer == None:
        last_layer = Dense(8,
                           name=id + 'dense_3_100',
                           activation='softmax',
                           trainable=True,
                           W_regularizer=l2(0))
        dense_3 = last_layer(dense_2_alex_act)
    else:
        dense_3 = last_layer(dense_2_alex_act)

    if finetune:
        model_classification = Model(input=inputs, output=dense_3)
        output = dense_2
    else:
        model_classification = Model(input=inputs, output=dense_3_alex)
        output = dense_2_alex

    if weights_path:
        model_classification.load_weights(weights_path)  #, by_name=True)
        print "model loaded"
        #model.save_weights('../../data/weights/alexnet_weights_finetune.h5')

    return dense_3, dense_2_alex_act, last_layer
Exemple #13
0
def MAlexNet(weights_path=None, inputs=None, id='', trainable=True):
    conv_1 = TimeDistributed(
        Convolution2D(96,
                      11,
                      11,
                      subsample=(4, 4),
                      activation='relu',
                      name=id + 'conv_1',
                      trainable=trainable))(inputs)

    conv_2 = TimeDistributed(MaxPooling2D((3, 3), strides=(2, 2)))(conv_1)
    conv_2 = TimeDistributed(crosschannelnormalization(name=id +
                                                       "convpool_1"))(conv_2)
    conv_2 = TimeDistributed(ZeroPadding2D((2, 2)))(conv_2)
    conv_2 = merge([
        TimeDistributed(
            Convolution2D(128,
                          5,
                          5,
                          activation="relu",
                          name=id + 'conv_2_' + str(i + 1),
                          trainable=trainable))(splittensor_r(
                              axis=2, ratio_split=2, id_split=i)(conv_2))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=2,
                   name=id + "conv_2")

    conv_3 = TimeDistributed(MaxPooling2D((3, 3), strides=(2, 2)))(conv_2)
    conv_3 = TimeDistributed(crosschannelnormalization())(conv_3)
    conv_3 = TimeDistributed(ZeroPadding2D((1, 1)))(conv_3)
    conv_3 = TimeDistributed(
        Convolution2D(384,
                      3,
                      3,
                      activation='relu',
                      name=id + 'conv_3',
                      trainable=trainable))(conv_3)

    conv_4 = TimeDistributed(ZeroPadding2D((1, 1)))(conv_3)
    conv_4 = merge([
        TimeDistributed(
            Convolution2D(192,
                          3,
                          3,
                          activation="relu",
                          name=id + 'conv_4_' + str(i + 1),
                          trainable=trainable))(splittensor_r(
                              axis=2, ratio_split=2, id_split=i)(conv_4))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=2,
                   name=id + "conv_4")

    conv_5 = TimeDistributed(ZeroPadding2D((1, 1)))(conv_4)
    conv_5 = merge([
        TimeDistributed(
            Convolution2D(128,
                          3,
                          3,
                          activation="relu",
                          name=id + 'conv_5_' + str(i + 1),
                          trainable=trainable))(splittensor_r(
                              axis=2, ratio_split=2, id_split=i)(conv_5))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=2,
                   name=id + "conv_5")

    dense_1 = TimeDistributed(
        MaxPooling2D((3, 3),
                     strides=(2, 2),
                     name=id + "convpool_5",
                     trainable=trainable))(conv_5)

    dense_1 = TimeDistributed(Flatten(name=id + "flatten"))(dense_1)
    dense_1 = TimeDistributed(
        Dense(4096,
              activation='relu',
              name=id + 'dense_1',
              trainable=trainable))(dense_1)

    dense_2 = TimeDistributed(Dense(4096, name=id + 'dense_4',
                                    trainable=True))(dense_1)
    dense_2_act = Activation('relu')(dense_2)

    dense_2_alex = TimeDistributed(
        Dense(4096, activation='relu', trainable=True))(dense_1)
    dense_3_alex = TimeDistributed(
        Dense(1000,
              name=id + 'dense_3_100',
              activation='sigmoid',
              trainable=trainable))(dense_2_alex)

    #dense_2_avg = Average(name=id+'dense_4_embedding')(dense_2_alex)
    dense_2_avg = MaxLayer(name=id + 'dense_4_embedding')(dense_2_alex)

    dense_3 = Dense(8,
                    activation='softmax',
                    name=id + 'dense_3_100',
                    trainable=True)(dense_2_avg)
    model_classification = Model(input=inputs, output=dense_3_alex)

    if weights_path:
        model_classification.load_weights(weights_path)  #, by_name=True)
        print "model loaded"
        #model.save_weights('../../data/weights/alexnet_weights_finetune.h5')

    return dense_3, dense_2_avg
def AlexNet_base(weights_path=None, input_tensor=None):
    if input_tensor is not None:
        inputs = input_tensor
    else:
        inputs = Input(shape=(3, 227, 227))

    mean_subtraction = Lambda(mean_subtract, name='mean_subtraction')(inputs)

    conv_1 = Convolution2D(96,
                           11,
                           11,
                           subsample=(4, 4),
                           activation='relu',
                           name='conv_1')(mean_subtraction)

    conv_2 = MaxPooling2D((3, 3), strides=(2, 2))(conv_1)
    conv_2 = crosschannelnormalization(name="convpool_1")(conv_2)
    conv_2 = ZeroPadding2D((2, 2))(conv_2)
    conv_2 = merge([
        Convolution2D(
            128, 5, 5, activation="relu", name='conv_2_' + str(i + 1))(
                splittensor(ratio_split=2, id_split=i)(conv_2))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name="conv_2")

    conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
    conv_3 = crosschannelnormalization()(conv_3)
    conv_3 = ZeroPadding2D((1, 1))(conv_3)
    conv_3 = Convolution2D(384, 3, 3, activation='relu', name='conv_3')(conv_3)

    conv_4 = ZeroPadding2D((1, 1))(conv_3)
    conv_4 = merge([
        Convolution2D(
            192, 3, 3, activation="relu", name='conv_4_' + str(i + 1))(
                splittensor(ratio_split=2, id_split=i)(conv_4))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name="conv_4")

    conv_5 = ZeroPadding2D((1, 1))(conv_4)
    conv_5 = merge([
        Convolution2D(
            128, 3, 3, activation="relu", name='conv_5_' + str(i + 1))(
                splittensor(ratio_split=2, id_split=i)(conv_5))
        for i in range(2)
    ],
                   mode='concat',
                   concat_axis=1,
                   name="conv_5")

    dense_1 = MaxPooling2D((3, 3), strides=(2, 2), name="convpool_5")(conv_5)

    dense_1 = Flatten(name="flatten")(dense_1)
    dense_1 = Dense(4096, activation='relu', name='dense_1')(dense_1)
    # dense_2 = Dropout(0.5)(dense_1)
    dense_2 = Dense(4096, activation='relu', name='dense_2')(dense_1)
    dense_3 = Dropout(0.5)(dense_2)
    dense_3 = Dense(1000, name='dense_3')(dense_3)
    prediction = Activation("softmax", name="softmax")(dense_3)

    model = Model(inputs=inputs, outputs=prediction)

    if weights_path:
        model.load_weights(weights_path)

    x = model.layers[29].output

    new_model = Model(inputs=inputs, outputs=x)

    return new_model
Exemple #15
0
def ZFNet(weights_path=None, classes=1000):

    inputs = Input(shape=(3, 227, 227))

    conv_1 = Convolution2D(96, (7, 7),
                           strides=(2, 2),
                           kernel_initializer='random_uniform',
                           bias_initializer='zeros',
                           activation='relu',
                           name='conv_1a')(inputs)
    conv_2 = MaxPooling2D((3, 3), strides=(2, 2))(conv_1)
    conv_2 = crosschannelnormalization(name="convpool_1")(conv_2)
    conv_2 = ZeroPadding2D((2, 2))(conv_2)
    conv_2 = concatenate([
        Convolution2D(128, (5, 5),
                      strides=(2, 2),
                      activation="relu",
                      name='conv_2' + str(i + 1))(splittensor(
                          ratio_split=2, id_split=i)(conv_2)) for i in range(2)
    ],
                         axis=1,
                         name="conv_2")

    conv_3 = MaxPooling2D((3, 3), strides=(2, 2))(conv_2)
    conv_3 = crosschannelnormalization()(conv_3)
    conv_3 = ZeroPadding2D((1, 1))(conv_3)
    conv_3 = Convolution2D(384, (3, 3), activation='relu',
                           name='conv_3')(conv_3)

    conv_4 = ZeroPadding2D((1, 1))(conv_3)
    conv_4 = concatenate([
        Convolution2D(
            192, (3, 3), activation="relu", name='conv_4_' + str(i + 1))(
                splittensor(ratio_split=2, id_split=i)(conv_4))
        for i in range(2)
    ],
                         axis=1,
                         name="conv_4")

    conv_5 = ZeroPadding2D((1, 1))(conv_4)
    conv_5 = concatenate([
        Convolution2D(
            128, (3, 3), activation="relu", name='conv_5_' + str(i + 1))(
                splittensor(ratio_split=2, id_split=i)(conv_5))
        for i in range(2)
    ],
                         axis=1,
                         name="conv_5")

    dense_1 = MaxPooling2D((3, 3), strides=(2, 2), name="convpool_5")(conv_5)

    dense_1 = Flatten(name="flatten")(dense_1)
    dense_1 = Dense(4096, activation='relu', name='dense_1')(dense_1)
    dense_2 = Dropout(0.5)(dense_1)
    dense_2 = Dense(4096, activation='relu', name='dense_2')(dense_2)
    dense_3 = Dropout(0.5)(dense_2)
    dense_3 = Dense(classes,
                    kernel_initializer='random_uniform',
                    bias_initializer='zeros',
                    name='dense_3a')(dense_3)
    prediction = Activation("softmax", name="softmaxa")(dense_3)

    model = Model(input=inputs, output=prediction, name='zfnet')

    if weights_path:
        model.load_weights(weights_path, by_name=True)

    sgd = SGD(lr=1e-4, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(optimizer=sgd,
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])

    return model