2017-01-16 2 views
2

я создал последовательную модель в CNTK и передавать эту модель в функцию потерь, как следующий:Альтернативы для функций потерь в питоне CNTK

ce = cross_entropy_with_softmax(model, labels) 

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

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

ответ

1

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

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

E.g. если функция модели возвращает тройку (заканчивающуюся чем-то вроде return combine([z1, z2, z3])), то ваша функция критерия, которую вы передадите трейнеру, может выглядеть так (если вы не используете 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)) 
0

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

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

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

+0

Я знал о «cross_entropy_with_softmax», как я уже говорил. Я также видел ноутбук. Но я не могу найти решение. Не могли бы вы скопировать образец из ваших ссылок, который работает с моделью и ярлыками, например, мой образец для «cross_entropy_with_softmax»? – OmG

1

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

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

Оригинальный ответ (действительна для фактического 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) 
+0

Я хочу многоклассовый классификатор, а не двоичный! – OmG

+0

Мы не различаем наличие одной бинарной метки и многих бинарных меток. Вышеизложенное должно работать. –

+0

Что вы подразумеваете под многими бинарными метками ?! Я сказал многоуровневый классификатор, и это означает, что мои данные имеют более одной метки (три метки), и каждая метка имеет более двух значений (30 разных значений). Поэтому мои вопросы: «cross_entropy_with_softmax» хорошо работает в этих ситуациях или нет? – OmG

Смежные вопросы