Python Arcface体系结构为任何面返回相同的嵌入

Python Arcface体系结构为任何面返回相同的嵌入,python,keras,deep-learning,face-recognition,arcface,Python,Keras,Deep Learning,Face Recognition,Arcface,我正在尝试使用Keras将arcface与inception resnet整合在一起,培训看起来是正确的,这意味着,它提高了准确性,在处理批次和年代时损失减少,但当我测试模型以获得嵌入时,我测试的任何面都返回相同的嵌入 ArcFace层的代码基于: 我的模型: def build_model(num_classes): label_input = Input(shape=(num_classes,)) inception_resnet = inception_resnet_v2.

我正在尝试使用Keras将arcface与inception resnet整合在一起,培训看起来是正确的,这意味着,它提高了准确性,在处理批次和年代时损失减少,但当我测试模型以获得嵌入时,我测试的任何面都返回相同的嵌入

ArcFace层的代码基于:

我的模型:

def build_model(num_classes):
    label_input = Input(shape=(num_classes,))
    inception_resnet = inception_resnet_v2.InceptionResNetV2(
        include_top=False,
        input_shape=(299, 299, 3))
    x = MaxPooling2D(pool_size=(2, 2))(inception_resnet.layers[-3].output)
    x = BatchNormalization()(x)
    x = Dropout(0.5)(x)
    x = Flatten()(x)
    x = Dense(512, kernel_initializer='he_normal')(x)
    x = BatchNormalization()(x)

    output = ArcFace(n_classes=num_classes)([x, label_input])
    model = Model(inputs=[inception_resnet.input, label_input],
                  outputs=output)
    # model.summary()

    return model
培训循环:

def train(model, train_gen, validate_gen, batch_size, out_dir):
    opt_adam = optimizers.Adam(clipvalue=5.0)
    model.compile(optimizer=opt_adam, loss='categorical_crossentropy',
            metrics=['accuracy'])

    now = datetime.now()
    str_date = now.strftime("%Y-%m-%d-%H")

    path = out_dir + '/'
    filepath = path + "arcface-weights_" + str_date + \
        "_{epoch:02d}-{loss:.4f}.hdf5"

    checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=1,
                                save_best_only=True, mode='min')

    logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
    tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir,
            update_freq='batch', batch_size=batch_size)

    callbacks_list = [checkpoint, tensorboard_callback]

    history = model.fit_generator(
      train_gen,
      steps_per_epoch=train_gen.samples/train_gen.batch_size,
      epochs=200,
      validation_data=validate_gen,
      validation_steps=validate_gen.samples/validate_gen.batch_size,
      verbose=1,
      callbacks=callbacks_list)

减少参数
s=16.0,m=0.2

def train(model, train_gen, validate_gen, batch_size, out_dir):
    opt_adam = optimizers.Adam(clipvalue=5.0)
    model.compile(optimizer=opt_adam, loss='categorical_crossentropy',
            metrics=['accuracy'])

    now = datetime.now()
    str_date = now.strftime("%Y-%m-%d-%H")

    path = out_dir + '/'
    filepath = path + "arcface-weights_" + str_date + \
        "_{epoch:02d}-{loss:.4f}.hdf5"

    checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=1,
                                save_best_only=True, mode='min')

    logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
    tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir,
            update_freq='batch', batch_size=batch_size)

    callbacks_list = [checkpoint, tensorboard_callback]

    history = model.fit_generator(
      train_gen,
      steps_per_epoch=train_gen.samples/train_gen.batch_size,
      epochs=200,
      validation_data=validate_gen,
      validation_steps=validate_gen.samples/validate_gen.batch_size,
      verbose=1,
      callbacks=callbacks_list)