Прогноз потери триплета на кодерах с питоном - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь реализовать функцию потери Тройки для идентификации лиц.Может ли кто-нибудь уточнить следующее:

  1. после обработки каждого изображения я получаю значения 128-float64 (кодировщик) с библиотекой dlib.
  2. Я подготовил базу данных лиц (изображения, кодировщики)(сотни тысяч человек)
  3. далее я создаю сеть:

    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
    
  4. и обучаю ее с моей базой данных:

    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)
    
  5. Тогда - как я могу предсказать два случайных кодера, если они один и тот же человек или разные?Примерно так:

    similarity_lvl = model_predict.predict([enc0, enc1]) # enc0, enc1 - encoders of random persons
    

    Нужно ли создавать другую модель и загружать в нее обученные веса?(если да - какая это модель?)

...