Определить собственные потери и классифицировать ошибку в cntk

Я понимаю, что люди обычно используют приведенные ниже потери и ошибки для обучения

ce = cross_entropy_with_softmax(z, label_var) 
pe = classification_error(z, label_var) 
trainer = Trainer(z, (ce, pe), ...)

Можем ли мы переопределить или определить собственные методы потерь и ошибок? Что нам действительно нужно, так это добавлять веса при расчете потерь и ошибок. Например, у нас есть 4 класса, важно (больше веса), чтобы не ошибиться в классификации первого класса как другого класса и наоборот, но не так важно (меньше веса), если он ошибочно классифицируется среди последних 3 классов. Как лучше всего справиться с этим в cntk?


person Jason Ruan    schedule 28.08.2017    source источник


Ответы (1)


Да, любое выражение CNTK является допустимой потерей или ошибкой: Здесь перекрестная энтропия:

ce = C.negate (C.reduce_sum (C.element_times (цель, C.log (прогноз)), ось = -1))

person Emad Barsoum    schedule 28.08.2017
comment
Замечательно! Я изо всех сил пытаюсь понять, как я могу добавить веса к приведенному вами примеру. Я думаю создать массив NxN error_weights, где N - количество классов. Однако я не уверен, как создать действительный убыток, используя error_weights, модель ResNet, z и ввод label_var, который похож на cross_entropy_with_softmax(z, label_var). Можно ли дать мне простой пример кода или несколько указаний, которым я могу следовать? Спасибо! - person Jason Ruan; 30.08.2017
comment
Думаю, я могу создать метод ниже, если смогу получить результат из модели z. Есть ли способ получить прогноз от модели? def my_criterion(z, target): прогноз = get_from_model(z) loss = calculate_loss_with_weights(прогноз, цель) обратная потеря - person Jason Ruan; 31.08.2017