Keras: потеря триплета с положительным и отрицательным образцом в партии
Я пытаюсь реорганизовать свой код Keras, чтобы использовать выборку "Batch Hard" для триплетов, как это предлагается в https://arxiv.org/pdf/1703.07737.pdf.
"Основная идея состоит в том, чтобы формировать пакеты путем случайной выборки P-классов (личностей), а затем случайной выборки K изображений каждого класса (человека), в результате чего получается партия изображений PK. Теперь для каждой выборки в партии, мы можем выбрать самые тяжелые положительные и самые тяжелые отрицательные сэмплы в партии при формировании триплетов для расчета потерь, которые мы называем "Пакетная обработка"
Итак, на данный момент у меня есть генератор Python (для использования с model.fit_generator в Keras), который производит пакеты на процессоре. Затем фактические прямые и обратные проходы через модель могут быть выполнены на графическом процессоре.
Однако, как это сделать с помощью метода "Batch Hard"? Генератор сэмплирует 64 изображения, для которых необходимо сформировать 64 триплета. Сначала требуется прямой проход для получения 64 вложений с текущей моделью.
embedding_model = Model(inputs = input_image, outputs = embedding)
Но тогда самый сложный положительный и самый тяжелый отрицательный должен быть выбран из 64 вложений, чтобы сформировать тройки. Тогда потеря может быть рассчитана
anchor = Input(input_shape, name='anchor')
positive = Input(input_shape, name='positive')
negative = Input(input_shape, name='negative')
f_anchor = embedding_model(anchor)
f_pos = embedding_model(pos)
f_neg = embedding_model(neg)
triplet_model = Model(inputs = [anchor, positive, negative], outputs=[f_anchor, f_pos, f_neg])
И эту triplet_model можно обучить, определив функцию потери триплета. Однако возможно ли с Keras использовать fit_generator и метод 'Batch Hard'? Или как получить доступ к вложениям из других образцов в пакете?
Редактировать: С помощью keras.layers.Lambda я могу определить собственный слой, создавая триплеты с вводом (batch_size, height, width, 3) и выводом (batch_size, 3, height, width, 3), но мне также нужен доступ к идентификаторам где-то, Возможно ли это внутри слоя?