Я пытаюсь реализовать функцию потери Тройки для идентификации лиц.Может ли кто-нибудь уточнить следующее:
- после обработки каждого изображения я получаю значения 128-float64 (кодировщик) с библиотекой dlib.
- Я подготовил базу данных лиц (изображения, кодировщики)(сотни тысяч человек)
далее я создаю сеть:
def create_base_net_simple(input):
x = Flatten()(input)
x = Dense(128, activation='relu')(x)
x = Dropout(0.1)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.1)(x)
x = Dense(128, activation='relu')(x)
return Model(input, x)
def triplet_merge(inputs):
a, p, n = inputs
return K.sum(a * (p - n), axis=1)
def triplet_merge_shape(input_shapes):
return (input_shapes[0][0], 1)
def triplet_loss(y_true, y_pred):
return -K.mean(K.log(K.sigmoid(y_pred)))
def build_model(n_in):
a = Input(shape=(n_in,))
p = Input(shape=(n_in,))
n = Input(shape=(n_in,))
base_model = create_base_net_simple(Input(shape=(n_in, 1)))
a_model = base_model(a) # anchor
p_model = base_model(p) # pos
n_model = base_model(n) # neg
e = merge([a_model, p_model, n_model], mode=triplet_merge, output_shape=triplet_merge_shape)
model = Model(input=[a, p, n], output=e)
model.compile(loss=triplet_loss, optimizer='rmsprop')
return model
и обучаю ее с моей базой данных:
anch = [...] # array of anchor Encoders (128-vector)
pos = [...] # array of positive Encoders - same person
neg = [...] # array of neg Encoders - random other person
# so anch[i] is encoder of same person as pos[i], but neg[i] is different person
labels = [...] # array of zeros
n_in = 128 # encoder len
model = build_model(n_in)
model.fit([anch, pos, neg], labels, batch_size=2048, nb_epoch=60)
net_name = cur_dir + os.sep + 'TrainedModel.h5'
model.save_weights(net_name)
Тогда - как я могу предсказать два случайных кодера, если они один и тот же человек или разные?Примерно так:
similarity_lvl = model_predict.predict([enc0, enc1]) # enc0, enc1 - encoders of random persons
Нужно ли создавать другую модель и загружать в нее обученные веса?(если да - какая это модель?)