Альтернативы для функций потерь в 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 для полного примера.