Альтернативы для функций потерь в Python CNTK

Я создал последовательную модель в CNTK и передал эту модель в функцию потерь, как показано ниже:

ce = cross_entropy_with_softmax(model, labels)

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

Я должен заметить, что я нашел эти альтернативы (логистическая и взвешенная логистика) в языке BrainScript, но не в Python.

3 ответа

Решение

"Мои данные имеют более одной метки (три метки), и каждая метка имеет более двух значений (30 разных значений)"

Правильно ли я понимаю, у вас есть 3 сетевых выхода и соответствующие метки, и каждый из них является классификатором 1-в-30? Тогда, кажется, вы можете просто добавить три cross_entropy_with_softmax() ценности. Это то, что вы хотите?

Например, если функция модели возвращает тройку (заканчивающуюся чем-то вроде return combine([z1, z2, z3])), тогда ваша функция критерия, которую вы передаете Trainer, может выглядеть так (если вы не используете Python 3, синтаксис немного другой):

from cntk.layers.typing import Tensor, SparseTensor
@Function
def my_criterion(input : Tensor[input_dim], labels1 : SparseTensor[30],
                 labels2 : SparseTensor[30], labels3 : SparseTensor[30]):
    z1, z2, z3 = my_model(input).outputs
    loss = cross_entropy_with_softmax(z1, labels1) + \
           cross_entropy_with_softmax(z2, labels2) + \
           cross_entropy_with_softmax(z3, labels3)
    return loss

learner = ...
trainer = Trainer(None, my_criterion, learner)

# in MB loop:
input_mb, L1_mb, L2_mb, L3_mb = my_next_minibatch()
trainer.train_minibatch(my_criterion.argument_map(input_mb, L1_mb, L2_mb, L3_mb))

Обновление (на основе комментариев ниже): Если вы используете последовательную модель, то вам, вероятно, интересно взять сумму по всем позициям в последовательности потерь в каждой позиции. cross_entropy_with_softmax подходит для потери на позицию, и CNTK автоматически вычислит сумму значений потерь по всем позициям в последовательности.

Обратите внимание, что терминология multilabel здесь нестандартно, так как обычно это относится к проблемам с несколькими двоичными метками. Вики-страница, на которую вы ссылаетесь, относится к тому делу, которое отличается от того, что вы делаете.

Оригинальный ответ (действительно для случая с несколькими метками ): вы можете использовать binary_cross_entropy или weighted_binary_cross_entropy, (Мы решили переименовать Logistic при портировании это на Python). На момент написания этой статьи эти операции поддерживают только метки {0,1}. Если ваши метки в (0,1), вам нужно будет определить свою потерю следующим образом

import cntk as C
my_bce = label*C.log(model)+(1-label)*C.log(1-model)

В настоящее время большинство операторов находятся в cntk.ops пакет и задокументировано здесь. Единственным исключением являются операторы, связанные с последовательностями, которые находятся в cntk.ops.sequence,

У нас есть планы реструктурировать пространство оператора (без нарушения обратной совместимости), чтобы увеличить возможность обнаружения.

Для вашего конкретного случая, cross_entropy_with_softmax кажется разумным выбором, и вы можете найти его документацию с примерами здесь. Пожалуйста, также проверьте этот ноутбук Jupyter для полного примера.

Другие вопросы по тегам