Функция Keras Loss с использованием выходов партии - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь выучить совместное встраиваемое представление изображений и текста, используя нейронную сеть с двумя ветвями, используя keras . Вот как выглядит моя модель: model structure

Это текущие входы и выходы моей модели обучения:

model = Model([txt_input,img_input], [encoded_txt, encoded_img])

Я должен использовать двунаправленную потерю ранжирования, что означает что представления соответствующего текста и изображений должны быть ближе друг к другу, чем любое другое изображение / текст, с полем m. Это полная функция потерь, с

  • s: функция подобия
  • D: обучающий набор
  • Yi +: набор соответствующих (положительных) текстовых описаний заданное изображение xi (только один положительный в моем эксперименте)
  • Yi-: набор не соответствующих (отрицательных) описаний данного изображения xi
  • Xi +: набор соответствующих (положительных) изображений данного текста описание yi (только один положительный результат в моем эксперименте)
  • Xi-: набор несоответствующих (отрицательных) изображений с указанным текстом описания yi

Loss formula

Проблема состоит в том, что для того, чтобы вычислить эту потерю для примера, мне нужно не только узнать выходные данные текущего изображения и соответствующего текстового представления, но и вычислить их сходство с представлениями других изображений / текстов.

Конкретно, мой вопрос: Есть ли способ включить выходные данные всей партии или, по крайней мере, предыдущих n выборок, при расчете потерь?

Единственный способ, которым я вижу, как это сделать, - создать функцию потерь со своего рода состоянием, в котором хранятся представления последних n выборок, и использовать их для вычисления сходства. Я не думаю, что это хорошее решение, и мне было интересно, есть ли более элегантный способ реализовать это. Я также изучаю другие фреймворки, такие как Pytorch, чтобы проверить, поддерживают ли они что-то вроде периодических потерь. Любая помощь будет принята с благодарностью.

Спасибо!

PS: Я на самом деле пытаюсь воспроизвести эксперимент этой статьи:

L , Ванг, Ю. Ли и С. Лазебник, «Изучение глубоких структурно-сохраняющих вложений изображения-текста», в трудах конференции IEEE по компьютерному зрению и распознаванию образов, стр. 5005–5013, 2016.

Изображение было также извлечено из этой бумаги.

1 Ответ

1 голос
/ 16 апреля 2020

Конкретно, мой вопрос таков: есть ли способ включить выходные данные всей партии или, по крайней мере, предыдущих n выборок, при расчете потерь?

Я думаю, что вы неправильно сформулировали свой вопрос или неправильно поняли. Допустим, вы установили размер партии = 8 во время тренировки, ваша функция потерь получает ровно всю партию, а потеря рассчитывается для партии.

Проверьте реализацию потерь в керасе.

class LossFunctionWrapper(Loss):
    """Wraps a loss function in the `Loss` class.
    # Arguments
        fn: The loss function to wrap, with signature `fn(y_true, y_pred,
            **kwargs)`.
        reduction: (Optional) Type of loss reduction to apply to loss.
            Default value is `SUM_OVER_BATCH_SIZE`.
        name: (Optional) name for the loss.
        **kwargs: The keyword arguments that are passed on to `fn`.
    """

Значение по умолчанию: SUM_OVER_BATCH_SIZE.

Таким образом, вы можете рассчитать потери для всей партии.

Кроме того, вы можете использовать концепцию триплетных потерь и генерировать положительные и отрицательные выборки с флажком в функции потерь для упрощения вычислений.

Наконец, вот реализация тензора, которая может помочь: https://github.com/lwwang/Two_branch_network

...