Python Arcface体系结构为任何面返回相同的嵌入
我正在尝试使用Keras将arcface与inception resnet整合在一起,培训看起来是正确的,这意味着,它提高了准确性,在处理批次和年代时损失减少,但当我测试模型以获得嵌入时,我测试的任何面都返回相同的嵌入 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.
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)